Haskell树大小
还是个哈斯凯尔人 我想得到一棵树的大小Haskell树大小,haskell,tree,Haskell,Tree,还是个哈斯凯尔人 我想得到一棵树的大小 data Tree a = Leaf a | Node (Tree a) (Tree a) size :: Tree a -> Int size empty = 0 size (Leaf n) = 1 size (Node x z) = size x + size z + 1 如果我用 size (Node (Node (Leaf 1)(Leaf 3)) (Leaf 2)) 我得到的只是0。代码正确吗?我只是没有正确调用它 顺便说一句,我
data Tree a = Leaf a | Node (Tree a) (Tree a)
size :: Tree a -> Int
size empty = 0
size (Leaf n) = 1
size (Node x z) = size x + size z + 1
如果我用
size (Node (Node (Leaf 1)(Leaf 3)) (Leaf 2))
我得到的只是0。代码正确吗?我只是没有正确调用它
顺便说一句,我已经看到了很多使用Empty而不是Empty的示例,但是这会在编译时导致错误。我在这里遗漏了什么?请注意,在
size
函数中有一个重叠模式匹配。行size empty
将始终进行模式匹配,结果总是0
的值。您的size
函数应该如下所示:
size :: Tree a -> Int
size (Leaf n) = 1
size (Node x z) = size x + size z + 1
ghci中的演示:
λ> size (Node (Node (Leaf 1)(Leaf 3)) (Leaf 2))
5
请注意,
size
函数中存在重叠模式匹配。行size empty
将始终进行模式匹配,结果总是0
的值。您的size
函数应该如下所示:
size :: Tree a -> Int
size (Leaf n) = 1
size (Node x z) = size x + size z + 1
ghci中的演示:
λ> size (Node (Node (Leaf 1)(Leaf 3)) (Leaf 2))
5
这一行有问题:
size empty = 0
empty
不是构造函数,因此它匹配任何内容,并立即返回0,使函数等效于const 0
因为无法用您的定义生成空树,所以添加这样一行是毫无意义的
如果您确实想使空树成为可能,则必须稍微更改定义:
data Tree a = Empty | Node a (Tree a) (Tree a)
size Empty = 0
size (Node _ a b) = 1 + size a + size b
这一行有问题:
size empty = 0
empty
不是构造函数,因此它匹配任何内容,并立即返回0,使函数等效于const 0
因为无法用您的定义生成空树,所以添加这样一行是毫无意义的
如果您确实想使空树成为可能,则必须稍微更改定义:
data Tree a = Empty | Node a (Tree a) (Tree a)
size Empty = 0
size (Node _ a b) = 1 + size a + size b
谢谢,我想这可能是问题所在。我怎样才能空出去工作?导入一些东西吗?@user3633383查看一下您的树数据类型。根据你的定义,有可能有一棵空树吗?谢谢,我想这可能就是问题所在。我怎样才能空出去工作?导入一些东西吗?@user3633383查看一下您的树数据类型。根据你的定义,有可能有一棵空树吗?