7

Haskellから窒素で遊ぶために来て、私が例を見つけることができないいくつかのことに遭遇したので、誰かが私を助けることができれば:

Haskellのerlangのどこ(およびまたはletまたは親変数へのアクセス権を持つ任意のタイプの関数)?どのように?あなたはできる?

burnOrDie hotness = foldl1 (>>) $ map burn ["Jimmy", "Adam", "Gonzo"]
  where burn x
          | hotness < 3 = print $ x ++ ": Ouch!"
          | otherwise = print $ x ++ ": GAHHH! *die*"

部分適用?Haskell:addOne = +1

インラインラムダ関数?Haskell: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は楽しみまたは閉鎖を作成します。これは実際には同じことではありません。

Haskellのような部分評価はErlangには存在しませんが、funsを使用してハックすることはできます。

インラインラムダ(funs)をfun構文で定義します。したがって、マップは次のようになります。

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 に答える