7

来自 Haskell 与 Nitrogen 一起玩,遇到了一些我找不到例子的事情,所以如果有人可以帮助我:

Haskell在erlang中的where(和或let或任何类型的嵌套访问父变量的函数)?如何?你能?

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]

4

3 回答 3

10

我不是erlang专家,但我会尽力回答。

嵌套函数

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
于 2012-11-13T04:44:33.503 回答
4

Erlang 没有 Haskell 和其他语言那样的嵌套函数。当@Satvik 创建一个函数时,SQ = fun(C) -> C*C end他是在创建一个闭包,或者在 Erlang 中很有趣,而不是一个嵌套函数。该语法fun (...) -> ... end创建了一个有趣的或闭包。这不是一回事。

Erlang 中不存在 Haskell 中的部分评估,尽管您可以使用 funs 破解它。

fun您可以使用语法定义内联 lambda(乐趣) 。所以你的地图变成:

lists:map(fun (X) -> X+X end, [1,2,3])
于 2012-11-13T21:22:07.857 回答
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
于 2020-04-23T20:53:18.377 回答