我可以定义一个返回自身的OCaml函数吗?

我可以定义一个返回自身的OCaml函数吗?,ocaml,Ocaml,在Scheme中,我可以编写一个函数: (define (eat-line line) eat-line) let rec eat_line line = eat_line 我可以在循环中使用它,如: (define (loop op) (let ((line (read-line)) (loop (op line)))) 在OCaml中,我尝试定义一个函数: (define (eat-line line) eat-line) let rec eat_line lin

在Scheme中,我可以编写一个函数:

(define (eat-line line)
  eat-line)
let rec eat_line line = eat_line
我可以在循环中使用它,如:

(define (loop op)
  (let ((line (read-line))
    (loop (op line))))
在OCaml中,我尝试定义一个函数:

(define (eat-line line)
  eat-line)
let rec eat_line line = eat_line
但我得到了一个错误:

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

是否可以在OCaml中定义这样一个函数,或者类型系统阻止它?如果是,原因是什么?

如果在运行解释器或编译器时指定
-rectypes
,则可以定义函数:

$ 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>
$ocaml-矩形
OCaml版本4.01.0
#让rec eat_line=eat_line;;
val eat_line:'b->'a as'a=
#吃一行“是的”,“确实”;;
-:string->'a as'a=
#吃线3 5 7;;
-:int->“a as”a=

这种类型(递归或循环类型)在默认情况下是不允许的,因为它们通常是编码错误的结果。

感谢您令人惊讶的快速回答!读者:这是15年前讨论过的: