来自Haskell玩氮气并遇到一些我无法找到的例子,所以如果有人可以帮助我:
Haskell在erlang中的位置(和/或允许或任何类型的函数嵌套以访问父变量)?怎么样?你能吗?
burnOrDie hotness = foldl1 (>>) $ map burn ["Jimmy", "Adam", "Gonzo"]
where burn x
| hotness < 3 = print $ x ++ ": Ouch!"
| otherwise = print $ x ++ ": GAHHH! *die*"
部分申请?哈斯克尔:addOne = +1
内联lambda函数?哈斯克尔:map (\x -> x+x) [1,2,3]
答案 0 :(得分:9)
我不是二郎的专家,但我会尽力回答。
out(A) ->
X = A + 1,
SQ = fun(C) -> C*C end,
io:format("~p",[SQ(X)]).
这里SQ函数可以访问父变量。
与上面相同,您可以使用fun
来定义匿名函数。
我认为erlang没有任何理智的部分功能应用。你唯一能做的就是将函数包装回函数。
add(X) ->
Add2 = fun(Y) -> X + Y end,
Add2.
现在你可以做类似
的事情了1> c(test).
{ok,test}
2> A=test:add(1).
#Fun<test.0.41627352>
3> A(2).
3
答案 1 :(得分:3)
在Haskell和其他语言的意义上,Erlang没有嵌套函数。当@Satvik使用SQ = fun(C) -> C*C end
创建函数时,他在Erlang中创建了一个闭包或 fun ,而不是嵌套函数。语法fun (...) -> ... end
创建了一个有趣或闭包。这不是一回事。
在Erlang中不存在Haskell中的部分评估,尽管你可以使用它来破解它。
使用fun
语法定义内联lambda(funs)。所以你映射成为:
lists:map(fun (X) -> X+X end, [1,2,3])
答案 2 :(得分:1)
% partially evaluating a function of two arguments
partial_eval(F, X, Pos) -> case Pos of
1 -> fun(Y) -> F(X,Y) end;
2 -> fun(Y) -> F(Y,X) end
end.
partial_eval(F,X) -> partial_eval(F,X,1).
在控制台的名为test.erl
的模块中使用以上代码:
7> c(test).
{ok,test}
8> Sum = fun(X,Y) -> X + Y end.
#Fun<erl_eval.13.126501267>
9> PS = test:partial_eval(Sum,3).
#Fun<test.1.126208848>
10> PS(4).
7
11> (test:partial_eval(Sum,3))(4). % can be invoked directly too
7
12> Div = fun(X,Y) -> X/Y end.
#Fun<erl_eval.13.126501267>
13> (test:partial_eval(Div,27))(3).
9.0
14> (test:partial_eval(Div,10,2))(3). % partial evaluation of second parameter
0.3