男性は は「結果タイプ型の変数であるListLabels.fold_leftなどの機能が完全に適用されるものとしてみなされないことを注意してくださいと言うが作成されます。もしそうなら、誰かがなぜこれを説明することができます"
あなたの例ではどうなりますか?それは少し関わっていることに注意してください。
# ListLabels.fold_left;;
- : f:('a -> 'b -> 'a) -> init:'a -> 'b list -> 'a = <fun>
ちょうど古典的な使用である:ListLabels.fold_left
taks 3つの引数、f
ラベルすなわち機能、初期化子init
とリスト。 (男が言うように)
let add = (+) and i = 0
in ListLabels.fold_left ~add ~i [1;2;3];;
アプリケーションListLabels.fold_left ~add ~i [1;2;3]
で今
は、不完全と考えられています。つまり、
`ListLabels.fold_left
はunamed引数
[1;2;3]
を最初に受け取り、タイプ
f:('a -> int -> 'a) -> init:'a -> 'a
の関数を返します。この関数をfooと呼ぶことにしよう。
あなたはadd
とi
ラベルされた2つの名前付き引数を、与えているので、タイプ'a
はタイプadd:'c -> ~i:'d -> 'e
の機能タイプであると推測されます。
変数add
とi
のタイプに基づいて、タイプ'c
はint -> int -> int
でなければならない、と'd
はint
でなければなりません。
タイプ'a
の値を置き換えると、タイプ'a
はadd:(int -> int -> int) -> i:int -> 'e
であることがわかります。 そしてそのタイプは'a
に(つまり、名前の変更)'e
変換
に、不要な括弧を削除
f:((add:(int -> int -> int) -> i:int -> 'e)
-> int
-> (add:(int -> int -> int) -> i:int -> 'e))
-> init:(add:(int -> int -> int) -> i:int -> 'e)
-> (add:(int -> int -> int) -> i:int -> 'e)
、およびアルファである、(私はコピー&ペーストが;-)ありうれしいFOOの種類でこれを置き換える、我々が得ます
f:((add:(int -> int -> int) -> i:int -> 'a)
-> int
-> add:(int -> int -> int) -> i:int -> 'a)
-> init:(add:(int -> int -> int) -> i:int -> 'a)
-> add:(int -> int -> int) -> i:int -> 'a
これはfooのタイプです。しかし、fooには、~add
と~i
という2つの引数を渡していることに注意してください。したがって、最終的に得られる価値は、タイプadd:(int -> int -> int) -> i:int -> 'a
ではなく、タイプ'a
です。そして、あなたの例の全体のタイプは、コンパイラによって返されるように、
f:((add:(int -> int -> int) -> i:int -> 'a)
-> int
-> add:(int -> int -> int) -> i:int -> 'a)
-> init:(add:(int -> int -> int) -> i:int -> 'a)
-> 'a
ワウ - 何が混乱しているのですか?実際には意味がありますが、どうもありがとうございます! – scry
あなたも大歓迎ですが、解決するのも良かったです;-) – jrouquie