码迷,mamicode.com
首页 > 其他好文 > 详细

lua函数式编程应用

时间:2015-05-08 20:21:14      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

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

支持函数编程的语言特点:(以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?)。

lua函数式编程应用

标签:

原文地址:http://blog.csdn.net/tutuboke/article/details/45580257

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!