此 Haskell 示例中数据构造函数中“Pt”的含义

Posted

技术标签:

【中文标题】此 Haskell 示例中数据构造函数中“Pt”的含义【英文标题】:Meaning of `Pt'' in this Haskell example for data constructor 【发布时间】:2017-11-29 10:30:32 【问题描述】:

以下示例来自 Hudak、Peterson 和 Fasel 的 "A gentle introduction to Haskell 98":

data Point a = Pt a a

这个“Pt”是什么?它从何而来?这是什么意思?它是以前定义的,还是我们在这里定义的?它突然出现在文本中,以前没有提到过,“Pt Haskell”的谷歌返回葡萄牙语的 Haskell 文档;-)

编辑:感谢@unhammer 的回复,我现在看到这个对另一个问题的回答很好地解释了这个问题:here

【问题讨论】:

如果您解释了为什么问题是关于Pt 而不是关于该部分前面示例中的FalseGreen,这可能有助于理解您的困惑。 我将这些值视为 C 中的一种 enum:明确给出可能的值,因此该类型的变量可以取值 GreenFalse。我可以写let x=Green,x 的类型是Color Haskell Type vs Data Constructor的可能重复 所以这不是一个糟糕的直觉,非空数据构造函数简单地概括它,例如。 let x=Pt Green Red 会给你一个Point Color 类型的x。 是的,但是,写let x=Pt 是有效的,但是x 不是Point 类型,而是a -> a -> Point a。关键是要看到“Red”也不是一个值,而是一个返回值“Red”的数据构造函数。是否可以将“Red”定义为返回“FF0000”而不是“Red”? 【参考方案1】:

Pt 是您自己编造的名称。你用它来创建一个新的Point

λ> data Point a = Pt a a
λ> let p = Pt 1 2
λ> :t p
p :: Num a => Point a

(对于这些单构造函数数据,您还经常会看到它们的名称与类型相同,例如 data Point a = Point a a。)

【讨论】:

可爱。但是很奇怪。但是很可爱。谢谢你。此外,现在该段落的其余部分是有意义的。 这有什么奇怪的? (除非您指的是使用与类型构造函数和数据构造函数相同的名称。是的,这需要一些时间来适应。) 因为我们没有定义 Pt(没有明确地),所以我们只命名它。当您考虑它时,这是合乎逻辑的,但它与简单地枚举类型的可能值相比是一个飞跃(是的,我现在明白在枚举类型定义中,这些不是“值”,而是返回单个数据点的数据构造函数)。 @January 实际上,Haskell 数据类型定义表示法很紧凑,但可能会使初学者稍微感到困惑——在 SO 上,经常会看到这种混淆。如果您愿意,可以打开GADTSyntax 扩展并使用更详细的符号data Point a where Pt :: a -> a -> Point a,在其中显式提供Pt 的类型,就好像它是一个函数签名一样。这与紧凑型 100% 等效,也可用于多个构造函数。我认为这种语法对初学者来说更清楚(即使他们还没有阅读教程)。 这确实更符合逻辑。完全有道理。我发现我对语言本身的逻辑没有问题,而是奇怪的符号、速记和语法糖

以上是关于此 Haskell 示例中数据构造函数中“Pt”的含义的主要内容,如果未能解决你的问题,请参考以下文章

重新格式化 Haskell 数据构造函数类型程序并重新格式化

在Haskell中扩展数据类型

Haskell:makeLenses - 数据构造函数不在范围内

在 Haskell 中将字符串转换为类型构造函数

Haskell 示例中的函数组合

为什么我不能在不同的数据类型中重用相同的值构造函数?