可折叠二进制树永远不会完成一些foldMap查询?

时间:2014-12-11 13:29:11

标签: haskell

我尝试过制作BinaryTree可折叠。

这是我的BinaryTree:

data BinaryTree2 a = Node2 a (BinaryTree2 a) (BinaryTree2 a)
                   | Leaf2
                   deriving Show

然后我尝试通过实现foldMap来使其可折叠:

import qualified Data.Foldable as F
instance F.Foldable BinaryTree2 where
foldMap f Leaf2 = mempty
foldMap f (Node2 v l r) = f v `mappend` F.foldMap f l `mappend` F.foldMap f r

以上编译,但不起作用,除非可以通过查看第一个节点来回答查询。

t3 = Node2 3 (Node2 1 Leaf2 Leaf2) (Node2 5 Leaf2 Leaf2)

foldMap (Any . (== 3)) t3
-- ghc output: Any {getAny = True}

foldMap (All . (== 3)) t3
-- ghc never returns: All {getAll =

我做错了什么?

1 个答案:

答案 0 :(得分:3)

压痕。这很重要。

instance F.Foldable BinaryTree2 where
  foldMap f Leaf2 = mempty
  foldMap f (Node2 v l r) = f v `mappend` F.foldMap f l `mappend` F.foldMap f r
-- ^^^^^^

您应该使用foldMap代替F.foldMap,这应该让您感到难过。