沈黙
この場合は 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. #