let compose f g = fun x -> f (g x)
let mal2 x = 2 * x
let plus1 x = x + 1
let mal2Plus1 = compose plus1 mal2
val compose : ('b -> 'c) -> ('a -> 'b) -> ('a -> 'c)
作成の関数型の読み方を誰か教えてくれませんか
let compose f g = fun x -> f (g x)
let mal2 x = 2 * x
let plus1 x = x + 1
let mal2Plus1 = compose plus1 mal2
val compose : ('b -> 'c) -> ('a -> 'b) -> ('a -> 'c)
作成の関数型の読み方を誰か教えてくれませんか
関数型の読み方は、使い方によって複数あります。しかし、例 ( compose plus1 mal2
) で示した方法で使用する場合、次の読み方が理にかなっています。
compose
は次の関数です。
タイプの値を別'b -> 'c
のタイプの値に変換する方法を知っている関数自体である引数を取ります'b
'c
は、(再び)値を type の値に'a -> 'b
変換できる関数である別の引数を取ります。'a
'b
これら 2 つの関数を指定すると、それらを順番に実行'a
できます。値がある場合は、2 番目の関数を適用して type の値を取得し、'b
この値を最初の関数に渡して get することができます'c
。これはまさにcompose
そうするものです:
'a
て生成する合成関数です (これは、2 番目の関数を結果に適用し、次に最初の関数を結果に適用する'c
ことによってのみ実行できます)。'a
トーマスの答えは完全に正しいですが、カリー化については触れていません。
カリー化された関数とは何かをよりよく理解するには、関数を見てcompose
、その引数が関数であることをしばらく忘れてください。
元のコードの、、 との混同を避けるために、それら'x
を 、'y
、 と呼びましょう。'z
'a
'b
'c
val compose: 'x -> 'y -> 'z
命令型の世界では、次のように表示されます。
z compose(x theX, y theY);
これはとの2 つの引数を持つ関数で、 の値を返します。x
y
z
機能的な世界でval compose: 'x -> 'y -> 'z
は、2 つの本質的に異なる方法で考えることができます。
'x
と'y
を返す関数'z
'x
返す関数を返します。'y
'z
この 処理 を一部 適用と 呼 ぶ。
元の に戻ると、次のval compose : ('b -> 'c) -> ('a -> 'b) -> ('a -> 'c)
2 つの方法で読み取ることができます。
('b -> 'c)
と ('a -> 'b)
、対応するものを取ります。('a -> 'c)
('b -> 'c)
('a -> 'b)
('a -> 'c)