我刚刚开始使用Haskell,我想定义一个这样的类型:
data Point = Int | [Int]
即。在任何点我想存储一个整数或整数列表。 (最终我将把这些点存储在一个列表中)
由于某种原因,它告诉我[Int]有一个解析错误。
我误解了什么?
答案 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
的列表。