2016-03-22 10 views
0

私は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) 
+0

タイプ注釈を残そうとしましたか?使用した演算子から型を推論するのは非常に簡単です。 –

答えて

4

f i n-1(f i n)-1ではなく、あなたは、おそらく期待f i (n-1)として解析されます。 inkink

さらに

let rec f i n k (i:int) (n:int) (k:int->int) :int 

は、あなたの関数がの引数を取ることを意味します。

let rec f (i:int) (n:int) (k:int->int) :int 
+0

はい、ありがとうございます。これは '' a''を削除しますが、タイプはまだチェックしません。私はテキストを更新しました。 – qweruiop

+0

@qweruiop私はそれのために私の答えを更新しました。 – gallais

+0

私はそれを 'let rec f(i:int)(n:int)(k:int-> int):int'で型検査することを確認します。 –

関連する問題