树声明之间的区别?

Cha*_*ase 2 haskell

有什么区别

data Tree a = Leaf a | Node (a, Tree a, Tree a) deriving Show
Run Code Online (Sandbox Code Playgroud)

data Tree a = Leaf a | Node a (Tree a) (Tree a) deriving Show
Run Code Online (Sandbox Code Playgroud)

注意:节点的括号

Dan*_*zer 8

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

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

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

对于惯用且更有效的代码,请选择后者.