2016-12-02 21 views
3

部分的に機能を適用したい。エリクサーで何かカレーをする標準的な簡潔な方法はありますか?Elixirには標準的なcurry()関数がありますか?

私は、私はこのような代行うことができます知っている:

new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end 

new_func2 = fn -> my_func2(constant) end 

を、それは醜いです。

+1

このブログ記事を見ましたか? http://blog.patrikstorm.com/function-currying-in-elixir –

+0

ありがとうございます。私が見てきたように、私は実際にはもっと単純なもの、すなわちクロージャーを探していました。私はそれがまだ実際であることを確信していなかったので、記事は1.5歳です。 – raacer

答えて

5

あなたは少しそれをクリーンアップするためにキャプチャ&演算子を使用することができます

plus2 = &Kernel.+(2, &1) 
plus2.(4) 
6 

お知らせドットPLUS2の間で.をして、これは

のためにシンタックスシュガーのようなものであるので、それは括弧

です

plus2 = fn(right) -> Kernel.+(2, right) end 

すべての同じ規則が適用されます。あなたが "currying"している関数にすべての引数を与えなければならないように、あなたは任意の順序で定位置引数を置くことができます。

文書:http://elixir-lang.org/docs/stable/elixir/Kernel.SpecialForms.html#&/1

+0

ありがとう!これは良く見えますが、何らかの理由でfunc/1で動作しません。このコード "create_named_window =&create_window(title)"は、CompileErrorを生成します: "&、Mod.fun/arity、&local/arityまたは少なくとも1つの引数を&1として含むキャプチャの式で期待される&は、create_window( title) " – raacer

+1

@raacerキャプチャ演算子を使うときには少なくとも1つの引数を持たなければならないので、上記のように'&create_window(&1) 'できます。 – greggreg

+1

あなたのコメントにあなたが書いていることは、かなりカレー化された機能ではありません。それはクロージャです。部分関数アプリケーションを作成するのではなく、すべての引数を満たしていて、スコープ内で 'title'を使ってそれを呼び出そうとしています。あなたが望むのは、 'fn - > create_window(title)end'です。特にクロージャを作成するためです。ハスケルのようなカレーで有名な言語でさえ、あなたが残念なことに上記のカレーリングは存在しません。 – greggreg

関連する問題