[英]Why does the following type constructor take less arguments than the data constructor?
我有以下类型声明:
data Quadruple a b = Quad a a b b
(你们中的一些人可能会认识到另一个Haskell教程中的这个声明)。
我理解代码的意图: 创建一个名为Quadruple的数据类型。 它有一个名为Quad的单一类型构造函数,它带有四个值。 前两个值必须具有相同的类型,并且后两个值必须具有相同的类型。
我无法向自己解释为什么类型构造函数的参数少于数据构造函数。 我能想到的唯一解释是Haskell能够从类型声明中推断出,如果第一个值是a类型,那么第二个值也是如此,如果第三个值是b类型,那么第四个值也是如此。
这个对吗? 我在这里错过了什么吗? 我知道Haskell有类型推断所以这是有道理的,但我不想用错误的心理模型运行。 (第二次尝试学习Haskell)。
使用该类型可能更清楚
q = Quad 1 2 "peter" "paul"
在这里你可以看到有两种类型, Int
和String
。 所以q
是Quadruple Int String
类型。
因此有两种类型: Quadruple
的类型参数数量。 值构造函数需要4个值(/ fields): Quad
值构造函数的参数个数。
它就像函数一样,每个形式参数可以多次使用,比如sqr x = x * x
。
同样在这里: Quadruple
是一个类型构造函数:当给定两个参数类型a
和b
时,它构造一个新类型。 所以Quadruple Int Double
是一种类型; Quadruple Int Int
是另一种类型。
它的价值是如何创造的? 通过使用具有四个参数值的数据构造函数Quad
:一对具有一种类型,另一对具有另一种类型。 这就是你告诉Haskell的定义。 所以是的,它会在推断和检查类型时使用这些知识。
我认为你是对的 - 左侧只声明可以在右侧使用的类型变量1 。
所以以下所有内容都是有效的:
data A = A Int
在RHS上没有LHS => none的变量
data B b = B1 Int | B2 b
在LHS上有一个变量,并在RHS的一个构造函数中使用它; 请注意,您根本不需要使用变量 - 这称为幻像类型。
data C c = C Int
这还是有用的东西。
1 :除了存在类型
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.