私はCPSの非常に単純なOCamlの練習に取り組んでいます。行8-10は、2つの再帰呼び出しを1つの末尾再帰に変換することです。しかし、コンパイラは、ライン8の種類を文句:OCamlのCPS:タイプがチェックされない
File "tmp.ml", line 8, characters 9-14:
Error: This expression has type int -> int -> (int -> int) -> int but an expression was expected of type int
私は6行目は、int
を返すため、コンパイラは8行目でint
を期待していることを理解しています。しかし、誰かがライン8-10のタイプがintではない理由を説明することができますか?
4 let rec f i n k (i:int) (n:int) (k:int->int) :int =
5 if i + n < 0 then
6 k 1
7 else
8 (f i (n-1) (fun v ->
9 f (i-1) n (fun vv->
10 k (v + vv))))
11 in f 1 1 (fun x -> x)
タイプ注釈を残そうとしましたか?使用した演算子から型を推論するのは非常に簡単です。 –