数据类型无效

时间:2017-11-25 16:37:57

标签: haskell types algebraic-data-types

以下代码无效:

data A = Int | [Int] | (Int, Int)

为什么可以使用具体类型Int作为数据类型定义的一部分,而不是具体类型[Int](Int, Int)

1 个答案:

答案 0 :(得分:11)

  

为什么可以使用具体类型Int作为数据类型定义(..)

的一部分

不行

您在此处撰写的是数据类型A的定义,其中构造函数名为Int 。这与数据类型Int无关,构造函数的名称与类型名称相同只是巧合,但对于Haskell编译器来说这不是问题,因为Haskell有类型和构造函数名称之间的明确区别。

但是,您不能使用[Int],因为[Int]不是标识符(以方括号开头),也不是运算符(只能使用符号)。所以Haskell并不真正知道如何处理这个和输入错误。

如果要定义可以采用Int值的数据类型,则需要将其添加为参数。您还可以为[Int](Int, Int)参数定义构造函数。例如:

data A = Int Int | Ints [Int] | Int2 (Int,Int)

所以这里有三个构造函数:IntIntsInt2。第一个构造函数将Int作为参数,第二个构建函数为[Int],最后一个为(Int, Int)

话虽这么说,这可能会导致很多混乱,所以最好使用导致较少混淆的构造函数名称,例如:

data A = A Int | As [Int] | A2 (Int,Int)

请注意,A data A可用于函数的签名,而构造函数(粗体)用作值(因此在函数的实现中,即在子句的头部进行模式匹配,并在子句的主体中构造一个值。)