繁体   English   中英

为什么以下类型构造函数的参数少于数据构造函数?

[英]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"

在这里你可以看到有两种类型, IntString 所以qQuadruple Int String类型。

因此有两种类型: Quadruple的类型参数数量。 值构造函数需要4个值(/ fields): Quad值构造函数的参数个数。

它就像函数一样,每个形式参数可以多次使用,比如sqr x = x * x

同样在这里: Quadruple是一个类型构造函数:当给定两个参数类型ab时,它构造一个新类型。 所以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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM