`

[转]Erlang匿名函数的递归

 
阅读更多

来自: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支持定义匿名函数,例如: ```erlang Double = fun(X) -&gt; 2 * X end. ``` 这里定义了一个匿名函数`Double`,该函数接收一个参数`X`并返回其两倍的值。 - **列表操作**: 使用`lists`模块...

    Efficiency Guide (erlang)

    事实上,Erlang中的匿名函数(funs)是非常高效且灵活的工具,可用于多种用途,如延迟计算、并行处理等。在现代Erlang实现中,funs的执行效率相当高,几乎与直接调用函数相同。 ##### 1.2.2 误区:列表推导(List ...

    Erlang与云计算.pdf(确保可以打开)

    这里创建了一个新的进程,该进程执行匿名函数`fun() -&gt; loop(0) end`。 **1.4 收发消息** Erlang中的进程通信主要依赖于发送和接收消息。例如,可以使用以下语法向进程发送消息: ```erlang Pid ! Message, ``` ...

    Erlang中文手册

    - **高级函数**: 包括递归函数、匿名函数等。 - **设计模式**: 如工厂模式、单例模式等。 #### 1.3 并行编程 - **进程**: - **定义**: Erlang进程是轻量级的线程,它们通过消息传递而非共享内存的方式进行通信...

    函数与函数式编程

    λ表达式代表匿名函数,即没有名字的函数,形式为λ参数列表.函数体,例如λx.x表示接受一个参数x并返回x的函数。 2. **纯函数**:纯函数不依赖外部状态,也不影响外部世界。它们只依赖于输入参数,使得函数的执行...

    Erlang中遍历取出某个位置的最大值代码

    这个匿名函数调用了`lists:sublist`来获取每个子列表的最后一位元素(因为`length(X)-1`指定了从倒数第二位置开始提取长度为1的子列表)。这样,`lists:map`的输出就是一个新的列表,其中包含了A中每个子列表的最后...

    函数式编程.zip

    8. **λ演算**:λ演算是函数式编程的基础理论,它使用匿名函数(λ表达式)来表示计算。λ演算提供了一种纯函数式的环境,没有副作用,所有计算都可以表达为函数的应用。 9. **函数式编程语言**:有一些编程语言是...

    简单介绍fp相关的资料

    λ表达式是λ演算中的基本构造块,代表匿名函数。它们在现代编程语言中常用于函数式编程,尤其是在JavaScript等语言中的箭头函数。 函数式编程还提倡使用递归,一种自我引用的函数调用方式。通过递归,复杂的问题...

    elang 程序设计 第二版 源代码

    例如,`fun`关键字用于创建匿名函数,而模式匹配则在解构复杂数据结构时发挥重要作用。 2. **并发和并行**:Elang的轻量级进程(processes)和消息传递机制是其并发模型的核心。源代码中会包含大量进程间的通信示例...

    funcy:在JavaScript中添加功能模式匹配的实验

    JavaScript中的功能模式匹配模式匹配是条件分支的一种形式... 参数匹配任何内容,因此匹配成功,并且将“ 10”作为参数传递给匿名函数。 由于这是一个递归函数,它将与第二个模式匹配,直到该函数的参数达到零然后终止

Global site tag (gtag.js) - Google Analytics