パイプラインと関数合成の概要
F#の関数は、すでに宣言している関数を複数組み合わせることで再構成することが可能です。この機能のことを 関数合成(= function composition) と言います。通常、F#の関数は極力小さな機能のみで構成されるように作成していきます。それらを関数合成することで複雑な処理を実現していくわけです。関数合成をするためには、関数合成演算子 ">>" or "<<" を利用します。
// ------------------
// [ 構文 ]
// ------------------
let newFunctionA = function1 >> function2 >> ... >> functionN
let newFunctionB = functionN << ... << function2 << function1
newFunctionA関数 は 左から順に処理が流れてい行きます。逆に newFunctionB関数 は 右から順に処理が流れていきます。特段の理由がない限り通常は >> が使われます。
また、F#の関数はパイプライン化することができます。パイプライン化することによって、関数呼び出しを一連の連続した操作として連鎖させることができます。これは Linux などのターミナル操作に慣れて親しんでいる方にはお馴染みの機能だと思います。関数をパイプライン化するにはパイプライン演算子 "|>" or "<|" を利用します。
// ------------------
// [ 構文 ]
// ------------------
let resultA = function1 |> function2 |> ... |> functionN
let resultB = functionN <| ... <| function2 <| function1
パイプラインは関数合成とは違い、新しい関数を生成するわけではありません。その場で処理の連鎖をするための構文です。F#においては非常によく使われる機能なので、必ず使えるようになりましょう。
サンプルでみるパイプラインと関数合成
関数合成した場合もパイプライン化した場合も、最初の関数の結果を次の関数へと受け渡すような動作をします。サンプルを見てみるとそれがよくわかると思います。
これは実際どういった処理の流れになっているのでしょうか?もう少しわかりやすく例を分解してみましょう。
上記のサンプルは関数合成のみを分解したものですが、パイプライン化でも同じことが言えます。つまり、関数合成やパイプライン化は一時変数の省略や可読性向上のための機能というわけです。また、複数の関数をひとまとめにしたものに名前を付けることによって、何をしているかがわかりやすいコードとなります。
パイプライン化と関数合成を使えるか使えないかだけでコードの可読性はおろかコードの良し悪しにまで影響があるため、繰り返しとなりますが、必ず使えるようになりましょう。