此 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
而不是关于该部分前面示例中的False
或Green
,这可能有助于理解您的困惑。
我将这些值视为 C 中的一种 enum
:明确给出可能的值,因此该类型的变量可以取值 Green
或 False
。我可以写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 数据构造函数类型程序并重新格式化