2015-06-12 73 views
3

我知道Erlang支持匿名函数。我的问题是,我可以从函数返回一个函数,然后从外部调用返回的函数吗?如果是这样,我该怎么做?我知道这在许多语言中都是可能的,例如C和Python。这里是我试图这样做,但它不工作:Erlang:从函数返回函数

-module(test). 
-export([run/0]). 

test() -> 
    io:format("toasters", []). 

bagel() -> 
    test. 

run() -> 
    (bagel())(). 

结果:

Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] 

Eshell V6.2 (abort with ^G) 
1> c(test). 
test.erl:4: Warning: function test/0 is unused 
{ok,test} 
2> test:run(). 
** exception error: bad function test 
    in function test:run/0 (test.erl, line 11) 
3> 

回答

5

啊,在这里我们去:

-module(test). 
-export([run/0]). 

test() -> 
    io:format("toasters", []). 

bagel() -> 
    fun test/0. % <- This is what I needed to change. 

run() -> 
    (bagel())(). 

我一直在寻找here一个回答,而且他们没有明确说明,但靠近顶部的例子刚刚给我提示。

+2

这让我微笑 - 你找到了自己的答案,你现在永远不会忘记它。请记住,尽管函数*标签*是一个原子,但完整的函数标识就是它的标签/奇偶校验。 – zxq9

+0

@ zxq9我其实已经忘记了......但现在我永远不会忘记!我忘了在我的功能之前放入'fun',并想知道为什么我得到'badarith'错误;我正在分割一个原子! – sudo