lua函数式编程应用

来源:互联网 发布:软件开发知识库 编辑:程序博客网 时间:2024/06/07 05:07

本来要写个全面一点的 函数式编程文章,不过查了一些资料,发现看不太懂,境界不够,等有时间补上吧。

支持函数编程的语言特点:(以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")endlocal 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() --对不同的地方 调用自己的函数处理    endend

三,可作为参数传递给其他函数。

函数被当作一种数据对象,并且在程序中经常用到匿名函数。代码执行的过程中产生新的函数。我在写C代码的时候经常发现,很多时候我写了好几次似乎重复的代 码,但是由于它们一些细节不一样,没法封装到一个函数中。也许用lamda可以产生更灵活的局部函数。

例:不同的部分写在函数内部的局部函数中,相同的部分写在共同的函数中,最后调用传进去的函数。 从而精简了代码。

第一种:item1Func的局部函数用到的是 itemFunc1中的词法域。也是说用的item1Func1函数中的data 不是commonFunc中的data

local function main()  local data = {level="1", item1="2", item2="3"}  item1Func(data)  item2Func(data)endfunction item1Func(data)  local function callBack()    print("item1Func "..data.item1)  end  commonFunc(data, callBack)endfunction item2Func(data)  local function callBack()    print("item2Func "..data.item2)  end  commonFunc(data, callBack)endfunction commonFunc(xxx, callBack)  print("common "..xxx.level)  callBack(xxx)endmain()


第二种:传参数的调用的做法,局部函数接受参数

local function main()  local data = {level="1", item1="2", item2="3"}  item1Func(data)  item2Func(data)endfunction item1Func(data)  local function callBack(xxx)    print("item1Func "..xxx.item1)  end  commonFunc(data, callBack)endfunction item2Func(data)  local function callBack(xxx)    print("item2Func "..xxx.item2)  end  commonFunc(data, callBack, 22)endfunction commonFunc(xxx, callBack)  print("common "..xxx.level)  callBack(xxx)endmain()

四,函数还可作为其他函数的返回值。

这个我暂时没用用上,以后想到哪里用在补上

2,词法域。

一个函数如果嵌套在另一个函数中(写在内部的的函数具有当前父级的词法域。传参数传进去的函数不具有当前函数的词法域,只具有原来父级的词法域),内部的函数可以访问外部函数中的变量。

正确的词法域:

function func()  local data = {i=1,j=2}  local function fun()    print("data.i = "..data.j)  end  back(fun)endfunction 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()  endend

错误的词法域:

function func1()  local data = {i=1,j=2}  local function fun()    print("xxx.i = "..xxx.j)  end  back1(data, fun)endfunction back1(xxx ,callBack)  callBack()end



函数式编程的思想:(这个暂时不是特懂)

用函数式语言编程就跟做代数题一样,是在做化简。思维方式也与人在做数学题时类似。它的主要思想是将一些复杂的函数吧表达成一些简单函数的复合,如果学过可计算理论,或者递归论,或者拉姆达演算的话,理解起来就很容易了。

函数式语言关心的是一个问题是什么样的小问题的组合(what to do?),命令式语言关心的是怎样解决这个问题(how to do?)。

1 0