部分的に機能を適用したい。エリクサーで何かカレーをする標準的な簡潔な方法はありますか?Elixirには標準的なcurry()関数がありますか?
私は、私はこのような代行うことができます知っている:
new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end
new_func2 = fn -> my_func2(constant) end
を、それは醜いです。
部分的に機能を適用したい。エリクサーで何かカレーをする標準的な簡潔な方法はありますか?Elixirには標準的なcurry()関数がありますか?
私は、私はこのような代行うことができます知っている:
new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end
new_func2 = fn -> my_func2(constant) end
を、それは醜いです。
あなたは少しそれをクリーンアップするためにキャプチャ&
演算子を使用することができます
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
ありがとう!これは良く見えますが、何らかの理由でfunc/1で動作しません。このコード "create_named_window =&create_window(title)"は、CompileErrorを生成します: "&、Mod.fun/arity、&local/arityまたは少なくとも1つの引数を&1として含むキャプチャの式で期待される&は、create_window( title) " – raacer
@raacerキャプチャ演算子を使うときには少なくとも1つの引数を持たなければならないので、上記のように'&create_window(&1) 'できます。 – greggreg
あなたのコメントにあなたが書いていることは、かなりカレー化された機能ではありません。それはクロージャです。部分関数アプリケーションを作成するのではなく、すべての引数を満たしていて、スコープ内で 'title'を使ってそれを呼び出そうとしています。あなたが望むのは、 'fn - > create_window(title)end'です。特にクロージャを作成するためです。ハスケルのようなカレーで有名な言語でさえ、あなたが残念なことに上記のカレーリングは存在しません。 – greggreg
このブログ記事を見ましたか? http://blog.patrikstorm.com/function-currying-in-elixir –
ありがとうございます。私が見てきたように、私は実際にはもっと単純なもの、すなわちクロージャーを探していました。私はそれがまだ実際であることを確信していなかったので、記事は1.5歳です。 – raacer