树声明之间的区别?

时间:2016-03-28 02:39:44

标签: haskell

之间有什么区别
data Tree a = Leaf a | Node (a, Tree a, Tree a) deriving Show

data Tree a = Leaf a | Node a (Tree a) (Tree a) deriving Show

注意:节点

的括号

1 个答案:

答案 0 :(得分:8)

有一点不同:在第一个Node中是一个带有一个字段的构造函数,一个元组。这意味着当我们给它一个类型时,它具有Node :: (a, Tree a, Tree a) -> Tree a形式,一个函数直接到树。后者是一个包含3个字段的构造函数,因此使用适当的curried函数键入构​​造函数。

现在可能看起来这些是等价的,但这两个声明中间接的数量存在显着差异。在第一个中,我们有一个指向3个指针元组的指针。在第二个中,我们在构造函数中直接有3个指针。这可能会对效率产生一些影响(如间接总是那样),并且还会在第一个定义Node undefined(或更一般地说,Node _|_)中引入额外的值,而这个定义并不明确相当于后者。

这样做的原因是Haskell中的每个间接层都使我们能够构造一个新的时髦伪值,其中最外层的包装器评估但是间接(提供懒惰)指向不同的thunk。如果你用严格的语言看待它们,你会发现它们是同构的,但严格来说,它们应该在Haskell的模型中有不同的表示。

对于惯用且效率更高的代码,请选择后者。