2013-04-24 13 views
7

私はHaskellの宿題の問題をErlangでやり直そうとしています。私には、そのパラメータのすべてを持たない関数のリストを使う方法があります。currying関数Erlang

例:私はこの倍を使用しようとしているが、私はそれは、コマンドラインでこれを使用してアキュムレータその後

%%inside my module) 
add(X,Y) -> X + Y. 

multiply(X,Y) -> X*Y. 

上で動作するように機能に渡す方法がわからない:

Erlangで
lists:foldl(fun(Function,Accumulator) -> Function(Accumulator) end, 3, [add(3),multiply(5)]). 

答えて

9

あなたはそれが必要なすべてのパラメータを渡す関数を呼び出す必要があります。しかし、あなたが必要とするパラメータだけを取り、あなたの関数を正しく呼び出す無名関数を作成することで、簡単に回避できます。

lists:foldl(fun (Function, Accumulator) -> Function(Accumulator) end, 3, 
    [fun (X) -> add(3, X) end, fun (X) -> multiply(5, X) end]). 
0
lists:foldl(
    fun(Function,Accumulator) -> Function(Accumulator) end, 
    3, 
    [ 
     fun(X) -> modname:add(3, X) end, 
     fun(X) -> modname:multiply(5, X) end 
    ] 
). 
+0

これはErlangに部分関数アプリケーションがないことを意味します(カリングはありません)。あなたはラムダ関数を使うので、Haskellでは部分適用関数(?)のリストを得ることができます: '[(+)1、( - )2、(*)3]'。それとも、部分関数アプリケーションと同じですか? – ichistmeinname

1

:これはあなたのタスクのための一例である

fun (X) -> add(3, X) end 

:あなたは、機能の追加1パラメータXを取り、呼び出す関数が必要な場合(3、X)は、あなたがそのような匿名関数を作成することができますerlang:apply/3と同様に呼ばれる部分的なアプリケーション関数をかなり簡単に書くことができます。それはあなたがカレーをサポートする言語で持っている優雅さが欠けています。

-module(partial). 

-export([apply/4]). 

apply(Module, Name, Arity, Args) when length(Args) < Arity -> 
    Left = Arity - length(Args), 
    fun(Args1) when length(Args1) < Left -> 
      fun(Args2) -> 
       apply(Module, Name, Arity, Args2 ++ Args1 ++ Args) 
      end; 
     (Args1) when length(Args1) > Left -> 
      erlang:error(badarg); 
     (Args1) -> 
      erlang:apply(Module, Name, Args1 ++ Args) 
    end; 
apply(_, _, Arity, Args) when length(Args) > Arity -> 
    erlang:error(badarg); 
apply(Module, Name, _, Args) -> 
    erlang:apply(Module, Name, Args). 
3

ネイティブのErlangでは、あなたが望むような部分的な評価の形式はありません。あなたはそれを行うためにあなた自身の楽しみを作成する必要があります。ただし、Erlando Monad Libraryを使用する場合は、パターンマッチングを使用して作成することができます。これは、erlangコンパイラがコードをコンパイルするときにASTで遊ぶことができるので、このようなクールなことをすることができます。

関連する問題