gpt4 book ai didi

haskell - 树声明之间的区别?

转载 作者:行者123 更新时间:2023-12-02 06:53:46 25 4
gpt4 key购买 nike

有什么区别

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

注意:节点的括号

最佳答案

有一个区别:第一个 Node 是一个带有一个字段的构造函数,一个元组。这意味着当我们给它一个类型时,它具有 Node::(a, Tree a, Tree a) -> Tree a 的形式,一个直接到树的函数。后者是一个具有 3 个字段的构造函数,因此构造函数是使用适当的柯里化(Currying)函数键入的。

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

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

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

关于haskell - 树声明之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com