它写道,Haskell 元组只是代数数据类型的不同语法。类似地,也有如何用元组重新定义值构造函数的示例。
例如,Haskell 中的 Tree 数据类型可以写为
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
可以像这样转换为“元组形式”:
data Tree a = EmptyTree | Node (a, Tree a, Tree a)
Node
第一个示例中的值构造函数与第二个示例中的实际构造函数有什么区别tuple
?即Node a (Tree a) (Tree a)
与(a, Tree a, Tree a)
(除了语法)?
在幕后,Node a (Tree a) (Tree a)
每个位置的适当类型的 3 元组只是不同的语法吗?
我知道您可以部分应用值构造函数,例如Node 5
将具有类型:(Node 5) :: Num a => Tree a -> Tree a -> Tree a
您也可以部分应用元组,将(,,)
其用作函数......但这不知道未绑定条目的潜在类型,例如:
Prelude> :t (,,) 5
(,,) 5 :: Num a => b -> c -> (a, b, c)
除非,我猜,你明确声明了一个类型::
。
除了像这样的语法特性,加上最后一个类型作用域的例子,Haskell 中的“值构造函数”实际上是什么,与用于存储相同类型的位置值的元组是值构造函数之间是否存在实质性区别?论据?