2014-12-28 16 views
9

Nello Schema, posso scrivere una funzione:Posso definire una funzione OCaml che restituisce sé stessa?

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

quale ho potuto utilizzare in un ciclo come:

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

In OCaml ho cercato di definire una funzione:

let rec eat_line line = eat_line 

Ma ho ricevuto l'errore:

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

È possibile definire tale funzione in OCaml o è impedita dal sistema di tipi? Se è così, perché?

risposta

12

È possibile definire la funzione se si specifica -rectypes quando si esegue l'interprete o compilatore:

$ 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> 

Tipi come questo (tipi ricorsivi o ciclici) non sono autorizzati per default, perché sono molto spesso il risultato di errori di codifica.

+1

Grazie per la risposta sorprendentemente rapida! –

+1

Per i lettori: questo è stato discusso 15 anni fa: http://caml.inria.fr/pub/old_caml_site/caml-list/2040.html –

Problemi correlati