https://qiita.com/maxmellon/items/9f4271fe1e25d04a2a94
パイプライン演算子はjavascriptに導入される可能性がある演算子で、左側を引数として右側の関数を実行した結果を得る操作を行う。
関数型言語から導入される概念である。
javascriptにおいては糖衣構文として実装される。現時点ではまだドラフトですらない。
パイプライン演算子は「|>」が割り当てられており、以下が等価である。
let = f3(f2(f1(99))); let = 99 |> f1 |> f2 |> f3;
http://dawn.hateblo.jp/entry/2018/12/17/134744
関数を次々に適用するとネストが深くなってしまう。
たとえば「配列の要素を2倍し,10以下の値だけを取り出し,絶対値でソートして,頭の3つを取り出す」はこうなる。
result = Enum.take(3)( Enum.sort_by(n => abs(n))( Enum.filter(n => n <= 10)( Enum.map(n => n * 2)( [2,1,15,-4,-5,-12] ) ) ) );
パイプラインはこの「関数を次々に適用するとネストが深くなってしまう」問題を解決してくれる。
パイプライン演算子を使うと以下のようになる。
ただし、関数がカリー化されていないとパイプライン演算子は活用し辛い。
result = [2,1,15,-4,-5,-12] |> Enum.map(n => n * 2) |> Enum.filter(n => n <= 10) |> Enum.sort_by(n => abs(n)) |> Enum.take(3);
LINQを代表とするメソッドチェーンと似ているが、パイプラインは処理対象のオブジェクト(配列)がmapやfilterなどのメソッドを持っている必要がない。
result = [2,1,15,-4,-5,-12] .map(n => n * 2) .filter(n => n <= 10) .sort_by(n => abs(n)) .take(3);
この2つはオブジェクト指向言語と関数型言語の思想の違いが真正面からぶつかっているようで面白い。
C#では「拡張メソッド」という奇妙な仕組みを使ってこれを無理やり実現していることから、この部分だけを見れば関数型言語側の解決方法の方がスマートと言えそう。
コマンドラインシェルで"|"記号を使ってコマンドをつなげる「パイプ」と同じ意味合いでもある。