我有以下类型声明:
ROUND
(有些人可能会从又一个Haskell教程中认识到这个声明。)
我理解代码的意图:创建一个名为Quadruple的数据类型。它有一个名为Quad的单一类型构造函数,它带有四个值。前两个值必须具有相同的类型,并且后两个值必须具有相同的类型。
我无法向自己解释为什么类型构造函数的参数少于数据构造函数。我能想到的唯一解释是Haskell能够从类型声明中推断出,如果第一个值是a类型,那么第二个值也是如此,如果第三个值是b类型,那么第四个值也是如此。
这是对的吗?我在这里错过了什么吗?我知道Haskell有类型推断因此这是有道理的,但我不想用错误的心理模型运行。 (第二次尝试学习Haskell)。
答案 0 :(得分:8)
使用类型
可能更清楚q = Quad 1 2 "peter" "paul"
您可以在此处看到有两种类型,Int
和String
。因此q
的类型为Quadruple Int String
。
因此有两种类型:Quadruple
的类型参数数量。值构造函数需要4个值(/ fields):Quad
值构造函数的参数个数。
答案 1 :(得分:5)
与函数类似,其中每个形式参数可以多次使用,例如sqr x = x * x
。
此处相同:Quadruple
是类型构造函数:当给定两种参数类型a
和b
时,它构造一个新类型。所以Quadruple Int Double
是一种类型; Quadruple Int Int
是另一种类型。
如何创建值?通过使用带有四个参数值的数据构造函数Quad
:一对具有一种类型,另一对具有另一种类型。这就是你告诉Haskell的定义。所以是的,它会在推断和检查类型时使用这些知识。
答案 2 :(得分:1)
我认为你是对的 - 左侧只声明可以在右侧使用的类型变量 1 。
所以以下所有内容都是有效的:
data A = A Int
在LHS上没有变量=>没有关于RHS
data B b = B1 Int | B2 b
在LHS上有一个变量,并在RHS的其中一个构造函数中使用它;请注意,您根本不需要使用变量 - 这称为幻像类型。
data C c = C Int
这仍然是有用的。
1 :除了存在类型