最終規則である高階関数の明示的な注釈については、次の関数の定義が適用されることを考慮してください。
# let apply g = g ~x:1 2 + 3;;
val apply : (x:int -> int -> int) -> int = <fun>
上記の行が理解できないため、次のことがわかりません。
コンパイラは、関数~g
にオプションの引数ではなく、ラベルが付いていると推測することに注意してください。ラベルがラベル付けされているかオプションでg ~x:1
あるかに関係なく、構文は同じですが、この 2 つは同じではありません。x
# apply (fun ?(x = 0) y -> x + y);; Characters 6-31:
apply (fun ?(x = 0) y -> x + y);; ^^^^^^^^^^^^^^^^^^^^^^^^^
この関数には型x:int -> int -> int
が必要ですが、その最初の引数にはラベルが付けられています~?x
コンパイラは常に、オプションではなく、引数がラベル付けされていると推論することを好みます。他の動作が必要な場合は、タイプを明示的に指定できます。
# let apply (g : ?x:int -> int -> int) = g ~x:1 2 + 3;; val apply : (?x:int -> int -> int) -> int = <fun>
# apply (fun ?(x = 0) y -> x + y);;
- : int = 6
助けてくれる人はいますか?