2009-08-10 15 views
7

Inspirado por this question:tipo de recursión explícita en Fa #

es explícito recursividad tipo posible en C#?

type 'a Mu = In of 'a Mu 'a 

let unIn (In x) = x 

Este código da por desgracia "parámetro Tipo no se puede utilizar como tipo de constructor

Observaciones:. Este constructo se utiliza en el documento Functional Programming with Overloading and Higher-Order Polymorphism, por ejemplo

Ejemplo de uso (. tomado de here):

type ('a, 'b) ListX = 
    | Nil 
    | Cons of 'a * 'b 

type 'a List = ListX Mu 

Respuesta

8

No, esto es imposible. Específicamente, los genéricos en F # tienen la misma limitación que el CLR, es decir, un < T> o un < 'a> debe tener el tipo "*". Esta misma limitación es lo que significa que no puede crear "clases de tipo" directamente en F #, ya que p. "Monad m" tomaría un argumento de mayor calidad 'm' (por ejemplo, "* -> *", donde, por ejemplo, 'lista' y 'opción' podrían ser instancias, siendo cada uno de ellos constructores de tipo genérico), pero esto no está permitido. .

+1

Las clases de tipo Haskell también funcionan en cosas de tipo '*' y, de hecho, las clases en tipos de alto grado se llamaron originalmente 'clases de constructor', aunque la distinción se ignora en este momento. –