2009-12-16 15 views
5

Estoy intentando enseñarme a mí mismo F # portando algún código Haskell.Haskell a F # - declare un tipo recursivo en f #

Specifily Estoy intentando portar el problema de cuenta atrás muestra here

El Código Haskell aparece here

Estoy tratando de crear los siguientes tipos de Haskell en F #:

data Op  = Add | Sub | Mul | Div 

data Expr = Val Int | App Op Expr Expr 

En F # Creo que el tipo de operación se define de la siguiente manera:

type Op = | Add | Sub | Mul | Div 

Tengo problemas con el tipo de Expr.

¿Cómo se puede crear un tipo recursivo? De this SO question parece que no se puede crear el tipo de Expr en F #.

También, ¿cuál es el equivalente F # del tipo 'Aplicación' que aplica el tipo Op al tipo Expr?

Si no es posible portar directamente este código, alguien podría sugerir una estructura de datos alternativa.

Respuesta

13

No es un problema definir tipos recursivos como este; lo que no se puede hacer es crear tipos de alto grado, que se parametrizan sobre constructores de tipo (y que no son necesarios para este ejemplo). Con cualquier definición de tipo de unión, debe separar el nombre del constructor de los parámetros del constructor con la palabra clave "of", y los parámetros mismos deben tomar la forma de un tipo de tupla (es decir, deben estar separados por asteriscos):

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

muchas gracias! – TonyAbell

1

@kvb ha publicado la respuesta correcta.

Ver también

F# forward type declarations

de cómo hacer las cosas cuando haces necesitan tipos mutuamente recursivos.