2016-03-22 9 views
0

Ich arbeite an einer sehr einfachen OCaml Übung auf CPS. Zeile 8-10 konvertiert zwei rekursive Aufrufe in eine Tail-Rekursion. Allerdings wirft der Compiler den Typ der Zeile 8:CPS in OCaml: Typ überprüft nicht

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

Ich verstehe, dass der Compiler eine int in Zeile 8, weil die Leitung 6 zurückkehrt ein int erwartet. Aber kann jemand illustrieren, warum der Typ von Zeile 8-10 kein int ist?

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

Haben Sie versucht, den Typ Annotation wegzulassen? Sehr einfach, die Typen von den verwendeten Operatoren abzuleiten. –

Antwort

4

f i n-1 als (f i n)-1 analysiert statt der f i (n-1) Sie vermutlich erwarten. Zusätzlich

,

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

bedeutet, dass Ihre Funktion Argumente nimmt: i, n, k, i, n und k. Sie sollten wahrscheinlich schreiben:

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

Ja, danke. Das beseitigt das "a", aber der Typ prüft immer noch nicht. Ich habe den Text aktualisiert. – qweruiop

+0

@qweruiop Ich habe meine Antwort aktualisiert, um das zu erklären. – gallais

+0

Ich bestätige, dass es typechecks mit 'let rec f (i: int) (n: int) (k: int-> int): int '. –