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

时间:2017-02-26 20:05:03

标签: haskell

我有以下类型声明:

ROUND

(有些人可能会从又一个Haskell教程中认识到这个声明。)

我理解代码的意图:创建一个名为Quadruple的数据类型。它有一个名为Quad的单一类型构造函数,它带有四个值。前两个值必须具有相同的类型,并且后两个值必须具有相同的类型。

我无法向自己解释为什么类型构造函数的参数少于数据构造函数。我能想到的唯一解释是Haskell能够从类型声明中推断出,如果第一个值是a类型,那么第二个值也是如此,如果第三个值是b类型,那么第四个值也是如此。

这是对的吗?我在这里错过了什么吗?我知道Haskell有类型推断因此这是有道理的,但我不想用错误的心理模型运行。 (第二次尝试学习Haskell)。

3 个答案:

答案 0 :(得分:8)

使用类型

可能更清楚
q = Quad 1 2 "peter" "paul"

您可以在此处看到有两种类型,IntString。因此q的类型为Quadruple Int String

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

答案 1 :(得分:5)

与函数类似,其中每个形式参数可以多次使用,例如sqr x = x * x

此处相同:Quadruple类型构造函数:当给定两种参数类型ab时,它构造一个新类型。所以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 :除了存在类型