3
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)

作成の関数型の読み方を誰か教えてくれませんか

4

2 に答える 2

7

関数型の読み方は、使い方によって複数あります。しかし、例 ( 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
于 2012-12-11T16:04:23.500 に答える
3

トーマスの答えは完全に正しいですが、カリー化については触れていません。

カリー化された関数とは何かをよりよく理解するには、関数を見てcompose、その引数が関数であることをしばらく忘れてください。

元のコードの、、 との混同を避けるために、それら'xを 、'y、 と呼びましょう。'z'a'b'c

val compose: 'x -> 'y -> 'z

命令型の世界では、次のように表示されます。

z compose(x theX, y theY);

これはとの2 つの引数を持つ関数で、 の値を返します。xyz

機能的な世界でval compose: 'x -> 'y -> 'zは、2 つの本質的に異なる方法で考えることができます。

  1. 2 つの引数'x'yを返す関数'z
  2. 引数が1 つの関数で、 の引数を1 つ取り、 を'x返す関数を返します。'y'z

この 処理 を一部 適用と 呼 ぶ。

元の に戻ると、次のval compose : ('b -> 'c) -> ('a -> 'b) -> ('a -> 'c)2 つの方法で読み取ることができます。

  1. まさにトーマスが説明したように:
    • 2 つの引数('b -> 'c)('a -> 'b)、対応するものを取ります。
    • タイプの関数を返します('a -> 'c)
  2. または、代わりに、関数
    • 1 つの引数を取ります('b -> 'c)
    • 次の関数を返します。
      • 1 つの引数を取ります('a -> 'b)
      • タイプの関数を返します('a -> 'c)
于 2012-12-11T16:22:52.243 に答える