2012-04-10 7 views
11

これらのすべてが関連しているようです。違いはなんですか?配管、合成、カリング

+5

適切なアプローチを見つける必要がある例がありますか?あなたの質問はかなり広いです。 – pad

+2

これは「プログラマー」のSOサイトにもっと適しているかもしれません。 –

+0

私はパッドに同意します - これはかなり自由な質問です(トマスとダニエルの回答は耐えられません)。 –

答えて

37
  • 配管は、いくつかの値で操作のシーケンスを実行するために使用されます(Unixの配管のように)。各関数への入力は、前の関数の出力です。明らかに、これは各関数が単一の引数をとることを必要とします。

  • 組成物(<</>>)は、配列内の2つの関数を呼び出すことに類似している(すなわち、第一の出力は、第2の入力である)が、それは直ちにシーケンスを呼び出すのではなく、関数を返します。

  • カリー化はNに1を適用することにより、新たな機能を作成-1だからN引数

の関数引数は、組成物とカリー化は、配管のために使用されるのに対し、関数を作成するために使用されます呼び出し。合成とカリングは、(argsと連鎖を適用して)新しい関数を作成する方法が異なります。ダニエルが書いたものに加えて

25

、配管(|><|オペレータ)および関数組成物(>><<事業者)との間の非常に密接な対応があります。

あなたは機能のseqenceにいくつかのデータを渡すために配管を使用します。

nums |> Seq.filter isOdd 
    |> Seq.map square 
    |> Seq.sum 

...、これは機能組成物を用いて得られた機能への入力を渡すことと同じである:

let composed = 
    Seq.filter isOdd 
    >> Seq.map square 
    >> Seq.sum 

composed nums 

実際には、引数のパイプを使用する関数宣言を関数の構成で置き換えることができます(関数を値として使用できるという事実を使用して)。ここに例があります:

// Explicit function declaration 
foo (fun x -> x |> bar |> goo) 

// Equivalent using function composition 
foo (bar >> goo)