2014-12-28 10 views
9

In Schema kann ich eine Funktion schreiben:Kann ich eine OCaml-Funktion definieren, die sich selbst zurückgibt?

(define (eat-line line) 
    eat-line) 

Was ich in einer Schleife wie verwenden:

(define (loop op) 
    (let ((line (read-line)) 
    (loop (op line)))) 

In OCaml habe ich versucht, eine Funktion zu definieren:

let rec eat_line line = eat_line 

Aber ich habe den Fehler:

Error: This expression has type 'a -> 'b 
    but an expression was expected of type 'b 
    The type variable 'b occurs inside 'a -> 'b 

Ist es möglich, eine solche Funktion in OCaml zu definieren, oder wird sie vom Typsystem verhindert? Wenn ja warum?

Antwort

12

können Sie die Funktion definieren, wenn Sie -rectypes angeben, wenn Sie den Interpreter oder Compiler laufen:

$ ocaml -rectypes 
     OCaml version 4.01.0 

# let rec eat_line line = eat_line;; 
val eat_line : 'b -> 'a as 'a = <fun> 

# eat_line "yes" "indeed";; 
- : string -> 'a as 'a = <fun> 
# eat_line 3 5 7;; 
- : int -> 'a as 'a = <fun> 

Typen wie diese (rekursiv oder zyklische Typen) sind standardmäßig nicht zulässig, da sie sehr oft das Ergebnis sind Codierungsfehler.

+1

Danke für die erstaunlich schnelle Antwort! –

+1

Für die Leser: Dies wurde vor 15 Jahren diskutiert: http://caml.inria.fr/pub/old_caml_site/caml-list/2040.html –

Verwandte Themen