沈黙

この場合は occur check が遅いんじゃないかと思ってみた。

$ ocaml
        Objective Caml version 3.10.0

# let f x = (x, x) in 
  let f x = f (f (f (f (f (f x))))) in 
  let f x = f (f (f (f (f (f x))))) in 
    ignore (f 0);;
^C
Interrupted.
# ^D
$ ocaml -rectypes
        Objective Caml version 3.10.0

# let f x = (x, x) in 
  let f x = f (f (f (f (f (f x))))) in 
  let f x = f (f (f (f (f (f x))))) in 
    ignore (f 0);;
- : unit = ()
# 
$ ocaml
        Objective Caml version 3.10.0

# let f x = object method m = (x, x) end;;
val f : 'a -> < m : 'a * 'a > = <fun>
# let f x = f (f (f (f (f (f x))))) in 
  let f x = f (f (f (f (f (f x))))) in 
    ignore (f 0);;
- : unit = ()
# type ('a, 'b) obj = < m : 'a * 'b >;;
type ('a, 'b) obj = < m : 'a * 'b >
# let f : 'a -> ('a, 'a) obj = f;;
val f : 'a -> ('a, 'a) obj = <fun>
# let f x = f (f (f (f (f (f x))))) in 
  let f x = f (f (f (f (f (f x))))) in 
    ignore (f 0);;
^C
Interrupted.
#