f# - recursivos - recursividad java
¿No son posibles los tipos infinitos(también conocidos como tipos recursivos) en F#? (3)
Estaba hablando con Sadek Drobi en Twitter cuando me enteré de que F # no parecía ser compatible con Infinite Types. Resulta que en C # puedes hacer algo en esta línea:
delegate RecDelegate<T> RecDelegate<T>(T x);
Sin embargo, después de un poco de experimentación en ambas partes, determinamos que lo mismo en F # parece imposible tanto implícita como explícitamente.
Explícito:
type ''a specialF = ''a->specialF<''a>
error FS0191: esta definición de tipo implica una referencia cíclica inmediata a través de una abreviatura, campo de estructura o relación de herencia.
Implícito:
let rec specialF (x: ''a) = specialF
Escriba desajuste. 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?
También puedes hacer algo como
type ''a RecType = RecType of (''a -> ''a RecType)
para crear un tipo con nombre a través del cual realizar la recursión. Ahora esto funciona:
let rec specialF = RecType (fun _ -> specialF)
type d<''T> = delegate of ''T -> d<''T> //''
let del : d<int> = null
let anotherDel = del.Invoke(1).Invoke(2).Invoke(3)
Creo que necesita un tipo con nombre que se pueda representar directamente en CLI para interrumpir la recursión, por lo que en F # significa que también necesita un tipo de delegado real.
Los tipos de registros recursivos deberían funcionar también.
type A = { A : A }
let rec a : A = { A = a }
Me interesaría una aplicación práctica. O incluso uno impráctico :)