Erlang等效的Haskell where / partial / lambda

时间:2012-11-13 04:20:20

标签: haskell functional-programming erlang

来自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]

3 个答案:

答案 0 :(得分:9)

我不是二郎的专家,但我会尽力回答。

嵌套函数

out(A) ->
    X = A + 1,
    SQ = fun(C) -> C*C end,
    io:format("~p",[SQ(X)]).

这里SQ函数可以访问父变量。

在Lambda

与上面相同,您可以使用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