我尝试过制作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 =
我做错了什么?
答案 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
,这应该让您感到难过。