数据类型无效

Jse*_*mol 2 haskell types algebraic-data-types

以下代码无效:

data A = Int | [Int] | (Int, Int)
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*sem 11

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

这是不正常.

你在这里写的是A具有名为Int构造函数的数据类型的定义.这与数据类型无关Int,只是巧合,构造函数的名称与类型名称相同,但这对Haskell编译器来说不是问题,因为Haskell在类型之间有明显的区别和构造函数名称.

[Int]但是你不能使用,因为[Int]它不是一个标识符(它以一个空方括号开头),也不是一个操作符(只能使用符号).所以Haskell并不真正知道如何处理这个和输入错误.

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

data A = Int Int | Ints [Int] | Int2 (Int,Int)
Run Code Online (Sandbox Code Playgroud)

因此,这里有三个构造函数:Int,Ints,和Int2.第一个构造函数接受一个Intas参数,第二个构造函数接受a [Int],最后一个构造函数接受a (Int, Int).

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

data A = A Int | As [Int] | A2 (Int,Int)
Run Code Online (Sandbox Code Playgroud)

注意,Aof data A可以在函数的签名中使用,而构造函数(以粗体显示)用作值(因此在函数的实现中,即子句的头部中的模式匹配,并且为了在子句的主体中构造一个值).