标签:
本来要写个全面一点的 函数式编程文章,不过查了一些资料,发现看不太懂,境界不够,等有时间补上吧。
支持函数编程的语言特点:(以lua为例)
1,函数是第一类值,与其他传统类型具有相同权利。
一,可以存储到变量中,无论是全局变量还是局部变量
例: function haha() print "haha" end local x = haha x() 输出haha
a = print a("hello world") 输出 hello world
二,可以存储到容器中,如table。
例:a = {p = print} a.p("hello world") 输出 hello world
这个非常有用,把一些相似的功能,配置到一个table的配表中,里面可以配置一些数据,与处理的子函数。优点:减少代码的重复,有一种面向对象的思想在里面。
local function callBack1() print("1") end local function callBack2() print("2") end local city = {town={level=1,process=80, callBack=callBack1}, union={level=2,process=100, callBack=callBack2} } local function cityHandle() for k, v in pairs(city) do --对通用数据的处理 v.callBack() --对不同的地方 调用自己的函数处理 end end
三,可作为参数传递给其他函数。
函数被当作一种数据对象,并且在程序中经常用到匿名函数。代码执行的过程中产生新的函数。我在写C代码的 时候经常发现,很多时候我写了好几次似乎重复的代 码,但是由于它们一些细节不一样,没法封装到一个函数中。也许用lamda可以产生更灵活的局部函数。
例:不同的部分写在函数内部的局部函数中,相同的部分写在共同的函数中,最后调用传进去的函数。 从而精简了代码。
第一种:item1Func的局部函数用到的是 itemFunc1中的词法域。也是说用的item1Func1函数中的data 不是commonFunc中的data
local function main() local data = {level="1", item1="2", item2="3"} item1Func(data) item2Func(data) end function item1Func(data) local function callBack() print("item1Func "..data.item1) end commonFunc(data, callBack) end function item2Func(data) local function callBack() print("item2Func "..data.item2) end commonFunc(data, callBack) end function commonFunc(xxx, callBack) print("common "..xxx.level) callBack(xxx) end main()
local function main() local data = {level="1", item1="2", item2="3"} item1Func(data) item2Func(data) end function item1Func(data) local function callBack(xxx) print("item1Func "..xxx.item1) end commonFunc(data, callBack) end function item2Func(data) local function callBack(xxx) print("item2Func "..xxx.item2) end commonFunc(data, callBack, 22) end function commonFunc(xxx, callBack) print("common "..xxx.level) callBack(xxx) end main()
四,函数还可作为其他函数的返回值。
这个我暂时没用用上,以后想到哪里用在补上
2,词法域。
一个函数如果嵌套在另一个函数中(写在内部的的函数具有当前父级的词法域。传参数传进去的函数不具有当前函数的词法域,只具有原来父级的词法域),内部的函数可以访问外部函数中的变量。
正确的词法域:
function func() local data = {i=1,j=2} local function fun() print("data.i = "..data.j) end back(fun) end function back(callBack) callBack() end子集的子集......也是享受词法域的
function func1() local data = {i=1,j=2} local function fun() print(data.i) local function xx() print(data.j) end xx() end end
错误的词法域:
function func1() local data = {i=1,j=2} local function fun() print("xxx.i = "..xxx.j) end back1(data, fun) end function back1(xxx ,callBack) callBack() end
用函数式语言编程就跟做代数题一样,是在做化简。思维方式也与人在做数学题时类似。它的主要思想是将一些复杂的函数吧表达成一些简单函数的复合,如果学过可计算理论,或者递归论,或者拉姆达演算的话,理解起来就很容易了。
函数式语言关心的是一个问题是什么样的小问题的组合(what to do?),命令式语言关心的是怎样解决这个问题(how to do?)。
标签:
原文地址:http://blog.csdn.net/tutuboke/article/details/45580257