Elixir Language
エリクシルの機能プログラミング
サーチ…
前書き
Elixirを使ってmapやreduceのような基本的な高次関数を実装しようとしましょう
地図
Mapは配列と関数をとり、その関数をそのリストの各要素に適用した後に配列を返す関数です
defmodule MyList do
def map([], _func) do
[]
end
def map([head | tail], func) do
[func.(head) | map(tail, func)]
end
end
ペーストをiex
コピーして実行します:
MyList.map [1,2,3], fn a -> a * 5 end
MyList.map [1,2,3], &(&1 * 5)
構文はMyList.map [1,2,3], &(&1 * 5)
減らす
Reduceは、配列、関数、アキュムレータをとり、 アキュムレータをシードとして使用して最初の要素で次のアキュムレータを与え、配列内のすべての要素に対して繰り返しを実行する関数です(以下の例を参照してください)
defmodule MyList do
def reduce([], _func, acc) do
acc
end
def reduce([head | tail], func, acc) do
reduce(tail, func, func.(acc, head))
end
end
上記のスニペットをiexに貼り付けてコピーします:
- すべての数値を配列に追加するには
MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
- 配列内のすべての数をmutliplyするには:
MyList.reduce [1,2,3,4], fn acc, element -> acc * element end, 1
例1の説明:
Iteration 1 => acc = 0, element = 1 ==> 0 + 1 ===> 1 = next accumulator
Iteration 2 => acc = 1, element = 2 ==> 1 + 2 ===> 3 = next accumulator
Iteration 3 => acc = 3, element = 3 ==> 3 + 3 ===> 6 = next accumulator
Iteration 4 => acc = 6, element = 4 ==> 6 + 4 ===> 10 = next accumulator = result(as all elements are done)
reduceを使用してリストをフィルタリングする
MyList.reduce [1,2,3,4], fn acc, element -> if rem(element,2) == 0 do acc else acc ++ [element] end end, []
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow