Haskell noobie:类型定义中的列表?

时间:2014-03-02 00:36:47

标签: haskell types

我刚刚开始使用Haskell,我想定义一个这样的类型:

data Point = Int | [Int]

即。在任何点我想存储一个整数或整数列表。 (最终我将把这些点存储在一个列表中)

由于某种原因,它告诉我[Int]有一个解析错误。

我误解了什么?

2 个答案:

答案 0 :(得分:7)

您的数据类型中的每个“选项”都需要一个值构造函数,以便您可以确定是否具有单个Int或Int列表。例如:

data Point = Single Int | Many [Int]

然后,您可以对此Point类型的值进行模式匹配:

examine :: Point -> String
examine (Single x) = "One: " ++ show x
examine (Many xs) = "Many: " ++ show xs

您的原始声明是非法的,否则将无法使用 Point值,而不知道它们持有什么。

答案 1 :(得分:6)

数据类型定义由一个或多个由|分隔的构造函数定义组成。构造函数定义是以大写字母开头的标识符,后跟零个或多个类型名称。

所以Int是一个有效的构造函数定义,因为它是一个以大写字母开头的标识符。但是,它定义了零参数的构造函数,并且与Int类型无任何关联。所以这不是你想要的。如果您想要一个包含Int类型值的构造函数,它应该类似于Single Int,它将定义一个名为Single的构造函数,它带有Int

[Int]不是有效的构造函数定义,因为它不以标识符开头。你可能想要像Many [Int]这样的东西。这将定义一个名为Many的构造函数,该构造函数采用Int的列表。