2015-11-13 7 views
8

のは、私のようなものがあるとしましょう:私はElixir Enum.mapの引数として、arity 2の関数を渡すには?

Enum.map(list, &String.duplicate/2) 

Enum.map(list, fn(x) -> String.duplicate("a", someValue * x) end) 

をしかし、その代わりに、私は私のコードを簡単にするために引数としてString.duplicate/2関数を渡すしたいと思いますあなたはアリティ1の機能のためにそれを行うことができることを知っている:

Enum.map(list, &String.downcase/1) 

ありがとう!

答えて

15

Enum.mapに2のアトリビュートを渡すことはできません。Enum.mapは、リスト内の各要素を引数として関数を呼び出します。あなたの例では

Enum.map(["FOO", "BAR", "BAZ"], fn(x) -> String.downcase(x) end) 
# String.downcase("FOO") 
# String.downcase("BAR") 
# String.downcase("BAZ") 

と:あなたはEnum.reduceのような他の関数を使用する場合、それは2

これのアリティを持つ関数は、リストの各項目と呼ばれてString.downcase/1関数の例です期待してい重複していると、1つの引数(文字列 "FOO")でString.duplicate/2を呼び出そうとしています。引数を1つしか必要と

Enum.map([1,2,3], &String.duplicate("a", &1)) 

あなたはまた、モジュール内という名前の関数を定義することができます。

あなたは(これはあなたが提供する機能を定義する簡単な方法です)関数を作成するには、キャプチャ構文を使用することができます例えば:

Enum.map([1, 2, 3], &duplicate_foo/1) 

def duplicate_foo(times), do: String.duplicate("a", times) 
+1

小さな加え:あなたの第二の例では、あなたがこのように括弧の1つのレベルを省略することができます: 'Enum.map([1,2,3]、&String.duplicate( "A"、&1 )) ') –

関連する問題