高階関数に(私が思うに)正しい型を指定すると、OCamlコンパイラはその関数の2回目の使用を拒否します。
コード
let foo ():string =
let f: ('a -> string) -> 'a -> string = fun g v -> g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x ^ y
次のエラーメッセージが表示されます
ファイル"test.ml"、6行目、文字14〜15: エラー:この式の型はfloat->stringです しかし、int->string型の式が期待されていました
したがって、の最初の使用法はf
、最初のパラメータのタイプをに固定しているようint -> string
です。理解できました。しかし、私が得られないのは、の型制限を省略f
すると問題が修正されるということです。
let foo ():string =
let f g v = g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x ^ y
f
また、グローバルスコープに移行すると、問題も修正されます。
let f: ('a -> string) -> 'a -> string = fun g v -> g v
let foo ():string =
let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x ^ y
最初の例がコンパイルされないのに、後の例はコンパイルされるのはなぜですか?