Haskell到F# - 在f#中声明一个递归类型

时间:2009-12-16 19:33:44

标签: haskell f#

我试图通过移植一些Haskell代码来教我自己的F#。

特别是我试图移植显示here

的倒计时问题

列出了Haskell代码here

我正在尝试在F#中创建以下Haskell类型:

data Op      = Add | Sub | Mul | Div

data Expr    = Val Int | App Op Expr Expr

在F#中,我认为Op类型的定义如下:

type Op = | Add | Sub | Mul | Div

我遇到了Expr类型的问题。

如何创建递归类型?从this SO question开始,看起来无法在F#中创建Expr类型。

还有什么是'App'类型的F#等价物,它将Op类型应用于Expr类型。

如果无法直接移植此代码,有人可能会提出替代数据结构。

2 个答案:

答案 0 :(得分:14)

定义这样的递归类型不是问题;你不能做的是创建更高级的类型,它们在类型构造函数上进行参数化(这个例子不需要它)。对于任何联合类型定义,您需要使用关键字“of”将构造函数名称与构造函数参数分开,并且参数本身应采用元组类型的形式(即它们应以星号分隔):

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

答案 1 :(得分:2)

@kvb发布了正确答案。

另见

F# forward type declarations

当你时需要相互递归的类型时如何做事。