2009-12-16 13 views
5

Sto cercando di insegnare a me stesso F # effettuando il porting di un codice Haskell.Haskell a F # - dichiara tipi ricorsivi in ​​f #

Specifily sto cercando di porto il conto alla rovescia Problema mostrato here

Il Codice Haskell è elencato here

Sto cercando di creare i seguenti tipi di Haskell in F #:

data Op  = Add | Sub | Mul | Div 

data Expr = Val Int | App Op Expr Expr 

in fa # Penso che il tipo Op sia definito come segue:

type Op = | Add | Sub | Mul | Div 

Ho problemi con il tipo Expr.

Come si crea un tipo ricorsivo? Da this SO question sembra che non sia possibile creare il tipo Expr in F #.

Anche qual è l'equivalente F # del tipo 'App' che applica s il tipo Op al tipo Expr.

Se non è possibile effettuare il porting diretto di questo codice, qualcuno potrebbe suggerire una struttura dati alternativa.

risposta

13

Non è un problema definire tipi ricorsivi come questo; ciò che non si può fare è creare tipi di tipo superiore, che sono parametrizzati sui costruttori di tipi (e che non sono necessari per questo esempio). Con qualsiasi definizione del tipo di unione, è necessario separare il nome del costruttore dai parametri del costruttore con la parola chiave "di", e i parametri stessi dovrebbero assumere la forma di un tipo di tupla (cioè dovrebbero essere separati da asterischi):

type Op = Add | Sub | Mul | Div 
type Expr = Val of int | App of Op * Expr * Expr 
+0

grazie mille! – TonyAbell

1

@kvb ha pubblicato la risposta corretta.

Vedi anche

F# forward type declarations

per il modo di fare le cose quando si fanno bisogno di tipi mutuamente ricorsivi.