2015-06-12 107 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