He estado pensando acerca de cómo funciona la inferencia de tipos en el siguiente programa de OCaml:con recursión mutua
let rec f x = (g x) + 5
and g x = f (x + 5);;
Por supuesto, el programa es bastante inútil (bucle para siempre), pero ¿qué pasa con los tipos? OCaml dice:
val f : int -> int = <fun>
val g : int -> int = <fun>
Esto es exactamente ser mi intuición, pero ¿cómo el algoritmo de inferencia de tipos sabe esto?
Diga el algoritmo considera "f" en primer lugar: la única limitación que puede llegar es que el tipo de retorno de "g" debe ser "int", y por lo tanto su propio tipo de retorno es también "int". Pero no puede inferir el tipo de su argumento mediante la definición de "f".
Por otro lado, si considera "g" primero, puede ver que el tipo de su propio argumento debe ser "int". Pero sin haber considerado "f" antes, no puede saber que el tipo de retorno de "g" también es "int".
¿Cuál es la magia detrás de esto?
Este documento lo discute: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.388.430&rep=rep1&type=pdf – Jeremy