elm编写实例 举例说明lambda函数的用法( 二 )


2. Elm中lambdas匿名函数实现以下功能
2.1 模式匹配
例如 。实现统计列表中大于10的数字数量 。代码以下:
Num:int
Num sumLarge = List.length <| List.filter(/xs>10) <| List.range 1 100
两行代码便可实现 。其中第一行 Num int 提醒统计数量是一个int类型定义 。List.range 1 100 是生成1至100的数字列表(elm中 。函数参数间以空格隔开) 。“<|”是级别最低的右关联符号 。意即生成列表后把列表结果作为输入向右侧函数提交 。List.filter是系统默认的梳理函数 。其参数是一个lambdas匿名函数 。意即遵从这个函数的功能对列表进行梳理 。这个lambda匿名函数(/xs>10)的功能就非常的容易理解 。把大于10的数字选出来 。括号也完全可以取消 。转化成 “<|”右关联函数 如<|xs>10 。当把大于10的数字filter选出来后结果也是一个列表 。把列表作为输入右关联到函数List.length 。就得出输出结果 。梳理出的列表个数 。这是个int类型的数字 。与第一行定义num:int一致 。
注意的是 。lambda匿名函数虽然给了研究者便利 。但不是什么情况下都要用 。有那么一些情况下 。不用lambdas更好 。如要把列表里的数字简单加3映射一下:
Sum: a -> List a -> List b
Sum newList = List.map(/xs = xs + 3) xs
在上例中 。会感觉newList函数定义得有那么一些拖油瓶 。出现了三个xs 。究其原因 。是因为map映射函数后定义的lambdas匿名函数拖油瓶 。其实完全可以如下所写:
Sum: a -> List a -> List b
Sum newList = List.map((+) 3) xs
原来 + 号也是一个lambda函数 。简单定义 (+) 3 就把原先的 xs抽离 。函数功能更加抽象 。这就是纯函数的意义 。
2.2 类型定义
Lambda函数还可以用作类型定义 。例如 。要实现一个参数交换的类型定义 。显式如下:
Arg: (a,b,c) -> b -> a -> c
Flip f x y = f y x
如果用lambda匿名函数的话 。可以如下:
Flip f = \x y = f y x
“\”号是lambdas匿名函数 。Flip函数用匿名函数定义 。既易读又比较酷 。2.3 折叠功能
elm函数式编程中 。map(映射)、fliter(过滤)、foldl、foldr(折叠)是常用的几个内置函数 。map和fliter方才已经使用过了 。现在尝试用foldl(左折叠)和foldr(右折叠)对列表元素进行折叠实现有趣的功能 。
首先是实现最基本的sum累加函数:
Sum: List number -> number
Sum xs = List.foldl(\x acc->acc+x) 0 xs
Foldl是左向折叠 。对象是xs列表 。0是折叠的起始值(也称累加器) 。(\x acc->acc+x)就是lambdas实现累加的匿名函数 。foldl每向左折叠一个元素时 。就把lambdas应用其它 。象扑克牌一样 。到最后就成为一叠(number)了 。
下一步实现一个检查元素是否在列表里的member函数:
Member: a->List a->Bool
Member y ys = List.foldl(\x acc -> if x==y then True else acc) False ys
在上例里 。最终输出是一个Bool布尔判断的结果(True or False) 。False作为 foldl的初始值 。如果不存在元素 。就False 。foldl折叠的动作就是一个lambda匿名函数(\x acc -> if x==y then True else acc) 。意思是判断输入元素是否与列表映射元素相符 。如果相符则初始值由False变为True 。否则还是原封不动) 。
好了 。通过折叠函数和lambdas匿名函数 。咱们顺利的制作了两个新函数:sum和member 。纯净没有副作用 。下来就可以利用这两个新函数 。作为乐高积木的最小块 。来尝试组合应用一下:
New1: List a ->Bool -> int
New1 result = sum <| member 1 [1,1,2,3,4]
得出结果是: 2
New2: list a ->Bool -> int
New2: result = sum <| member [1,2] [[1,2],[2,3],[3,4]]
得出结果是: 1

elm编写实例 举例说明lambda函数的用法

文章插图
四、结语【elm编写实例 举例说明lambda函数的用法】函数式编程 。是未来的趋势 。elm语言是前端特有的函数式编程语言 。而学会函数式编程 。lambda匿名函数是其中的精妙之一 。和map(映射)、filter(过滤)、foldl(折叠)组合起来 。变化无穷 。编程的过程既奥妙又愉悦 。本文只略作介绍 。欢迎讨论 。

推荐阅读