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)
Haben Sie versucht, den Typ Annotation wegzulassen? Sehr einfach, die Typen von den verwendeten Operatoren abzuleiten. –