来自:http://zfsgeek.blog.163.com/blog/static/20400908020121012104457436/
使用或者返回一个匿名函数的函数被称为高阶函数(Higer-order function)。普通的函数,它们递归是容易编写的,因为它们有个名字,你引用这个名字就可以了,而匿名函数没有名字,如何编写递归呢?
例子:
下面是一个计算一个list的累加和的匿名函数:
F = fun(This, [], Total) -> Total; (This, [H|T], Total) -> This(This, T, H+Total) end.
在erl的shell中输入:
1> F = fun(This, [], Total) -> Total; 1> (This, [H|T], Total) -> This(This, T, H+Total) end. #Fun<erl_eval.18.82930912> 2> F(F, [1,2,3], 0). 6
诀窍就是把匿名函数赋给F,然后在调用这个匿名函数时,把F作为参数传入进去。你可能会问,为什么在匿名函数里面无法使用符号F?那是因为定义这个函数时,F还不存在。
如果你觉的上面的函数还需要你知道如何调用递归的匿名函数,不是很方便,不妨多写一层,我在shell里输入:
1> G=fun(L) -> 1> F=fun(This, [], Total) -> Total; 1> (This, [H|T], Total) -> This(This, T, H+Total) end, 1> F(F, L, 0) end. #Fun<erl_eval.6.82930912> 2> G([1,2,3]). 6 3>
这里G引用的匿名函数内嵌一个匿名函数,内部是递归调用。
相关推荐
- **匿名函数**: Erlang支持定义匿名函数,例如: ```erlang Double = fun(X) -> 2 * X end. ``` 这里定义了一个匿名函数`Double`,该函数接收一个参数`X`并返回其两倍的值。 - **列表操作**: 使用`lists`模块...
事实上,Erlang中的匿名函数(funs)是非常高效且灵活的工具,可用于多种用途,如延迟计算、并行处理等。在现代Erlang实现中,funs的执行效率相当高,几乎与直接调用函数相同。 ##### 1.2.2 误区:列表推导(List ...
这里创建了一个新的进程,该进程执行匿名函数`fun() -> loop(0) end`。 **1.4 收发消息** Erlang中的进程通信主要依赖于发送和接收消息。例如,可以使用以下语法向进程发送消息: ```erlang Pid ! Message, ``` ...
λ表达式代表匿名函数,即没有名字的函数,形式为λ参数列表.函数体,例如λx.x表示接受一个参数x并返回x的函数。 2. **纯函数**:纯函数不依赖外部状态,也不影响外部世界。它们只依赖于输入参数,使得函数的执行...
这个匿名函数调用了`lists:sublist`来获取每个子列表的最后一位元素(因为`length(X)-1`指定了从倒数第二位置开始提取长度为1的子列表)。这样,`lists:map`的输出就是一个新的列表,其中包含了A中每个子列表的最后...
8. **λ演算**:λ演算是函数式编程的基础理论,它使用匿名函数(λ表达式)来表示计算。λ演算提供了一种纯函数式的环境,没有副作用,所有计算都可以表达为函数的应用。 9. **函数式编程语言**:有一些编程语言是...
λ表达式是λ演算中的基本构造块,代表匿名函数。它们在现代编程语言中常用于函数式编程,尤其是在JavaScript等语言中的箭头函数。 函数式编程还提倡使用递归,一种自我引用的函数调用方式。通过递归,复杂的问题...
例如,`fun`关键字用于创建匿名函数,而模式匹配则在解构复杂数据结构时发挥重要作用。 2. **并发和并行**:Elang的轻量级进程(processes)和消息传递机制是其并发模型的核心。源代码中会包含大量进程间的通信示例...
JavaScript中的功能模式匹配模式匹配是条件分支的一种形式... 参数匹配任何内容,因此匹配成功,并且将“ 10”作为参数传递给匿名函数。 由于这是一个递归函数,它将与第二个模式匹配,直到该函数的参数达到零然后终止