Estaba chateando con Sadek Drobi en twitter cuando me enteré de que F # no parecía ser compatible con Infinite Types. Resulta que en C# que puede hacer algo en este sentido:¿No son posibles los tipos infinitos (también conocidos como tipos recursivos) en F #?
delegate RecDelegate<T> RecDelegate<T>(T x);
Sin embargo, después de algunos experimentos por ambas partes, se determinó que la misma en Fa # parece imposible tanto implícita y explícita.
explícito:
type 'a specialF = 'a->specialF<'a>
FS0191 error: Esta definición de tipo implica una referencia cíclica inmediata a través de una abreviatura, campo struct o relación de herencia.
implícita:
let rec specialF (x: 'a) = specialF
de coincidencia de tipos. Esperando un 'b pero dado un' a -> 'b. El tipo resultante sería infinito al unificar '' b ' y' 'a ->' b '.
Por supuesto, estas son muestras intencionalmente simples.
Me preguntaba si de alguna manera estoy equivocado. Tal vez me perdí algún tipo de anotación necesaria?
¿Hay alguna aplicación práctica aquí, o fue la pregunta solo el resultado de investigar por diversión? – Brian
Por lo que yo entiendo, no hay aplicaciones prácticas referencialmente transparentes. Sin embargo, un ejemplo sería que con algún tipo de estado mudable cerrado esto puede ser útil para aplicaciones repetidas. ex: add (1) (2) (3) (4) - donde se puede hacer cualquier cantidad de aplicaciones. –
Aquí hay un programa OCaml que escribí que usa esta característica para evitar un nivel de direccionamiento indirecto usando rectypes. http://www.ffconsultancy.com/languages/ray_tracer/code/1/ray.ml –