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

Haskell noobie:类型定义中的列表?,haskell,types,Haskell,Types,我刚从Haskell开始,我想定义一个如下类型: data Point = Int | [Int] 在任何一点上,我都想存储一个整数或一组整数。最后,我将把这些点存储在一个列表中 出于某种原因,它告诉我在[Int]处有一个解析错误 我误解了什么?数据类型定义由一个或多个用|分隔的构造函数定义组成。构造函数定义是以大写字母开头,后跟零个或多个类型名的标识符 所以Int是一个有效的构造函数定义,因为它是一个以大写字母开头的标识符。但是,它定义了一个零参数的构造函数,并且与Int类型没有任何关系。所

我刚从Haskell开始,我想定义一个如下类型:

data Point = Int | [Int]
在任何一点上,我都想存储一个整数或一组整数。最后,我将把这些点存储在一个列表中

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


我误解了什么?

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

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


[Int]不是有效的构造函数定义,因为它不是以标识符开头的。您可能需要类似于许多[Int]的内容。这将定义一个名为Many的构造函数,该构造函数接受一个Int列表。

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

data Point = Single Int | Many [Int]
然后可以对该点类型的值进行模式匹配:


您的原始声明是非法的,因为否则无法使用点值,因为不知道它们包含什么。

但我认为[]只是列表构造函数的语法糖?@interstar data定义了一种新的数据类型。您可能想到了类型同义词。@interstar[]是列表类型。它不是真正的语法糖,因为没有其他方法来写它。无论哪种方式,构造函数都以构造函数名称而不是类型开头。正如我所解释的,这适用于两个构造函数,Int也不做您想要的事情,实际上根本不特定于列表。
examine :: Point -> String
examine (Single x) = "One: " ++ show x
examine (Many xs) = "Many: " ++ show xs