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可以在函数的签名中使用,而构造函数(以粗体显示)用作值(因此在函数的实现中,即子句的头部中的模式匹配,并且为了在子句的主体中构造一个值).