以下代码无效:
data A = Int | [Int] | (Int, Int)
为什么可以使用具体类型Int
作为数据类型定义的一部分,而不是具体类型[Int]
或(Int, Int)
?
答案 0 :(得分:11)
为什么可以使用具体类型Int作为数据类型定义(..)
的一部分
不行。
您在此处撰写的是数据类型A
的定义,其中构造函数名为Int
。这与数据类型Int
无关,构造函数的名称与类型名称相同只是巧合,但对于Haskell编译器来说这不是问题,因为Haskell有类型和构造函数名称之间的明确区别。
但是,您不能使用[Int]
,因为[Int]
不是标识符(以方括号开头),也不是运算符(只能使用符号)。所以Haskell并不真正知道如何处理这个和输入错误。
如果要定义可以采用Int
值的数据类型,则需要将其添加为参数。您还可以为[Int]
和(Int, Int)
参数定义构造函数。例如:
data A = Int Int | Ints [Int] | Int2 (Int,Int)
所以这里有三个构造函数:Int
,Ints
和Int2
。第一个构造函数将Int
作为参数,第二个构建函数为[Int]
,最后一个为(Int, Int)
。
话虽这么说,这可能会导致很多混乱,所以最好使用导致较少混淆的构造函数名称,例如:
data A = A Int | As [Int] | A2 (Int,Int)
请注意,A
data A
可用于函数的签名,而构造函数(粗体)用作值(因此在函数的实现中,即在子句的头部进行模式匹配,并在子句的主体中构造一个值。)