2009-08-10 22 views
7

Ispirato da this question:esplicita tipo ricorsione in F #

è esplicito tipo ricorsione possibile in F #?

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

let unIn (In x) = x 

Questo codice dà purtroppo "parametro Type non può essere usata come tipo di costruzione

Note:. Questo costrutto viene utilizzato nella carta Functional Programming with Overloading and Higher-Order Polymorphism, per esempio

Esempio di utilizzo (. preso da here):

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

type 'a List = ListX Mu 

risposta

8

No, questo è non possibile. Nello specifico, i generici in F # hanno la stessa limitazione del CLR, ovvero un < T> o uno < "a> devono avere un tipo" * ". Questa stessa limitazione è ciò che significa che non è possibile creare "classi di caratteri" direttamente in F #, poiché ad es. "Monad m" prenderebbe un argomento di tipo più alto "m" (es. "* -> *", dove es. "Elenco" e "opzione" potrebbero essere istanze, ognuno dei quali è di tipo generico), ma questo non è permesso .

+1

Le classi di tipo Haskell funzionano anche su cose di tipo '*' anche, e in effetti le classi sui tipi con caratteri più alti erano originariamente chiamate 'classi di costruttori', anche se la distinzione è per lo più ignorata ora. –