-1

最終規則である高階関数の明示的な注釈については、次の関数の定義が適用されることを考慮してください。

# 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

助けてくれる人はいますか?

4

1 に答える 1

1

?代わりに構文を試してください。

let apply g = g ?x:(Some 1) 2 + 3

g他の合理的なアプローチは、型シグネチャを与えることです。

let apply (g : ?x:int -> int -> int) = ...
于 2013-09-27T01:26:06.210 に答える