【Haskell】モノイドで畳み込む

import Data.Monoid
import qualified Data.Foldable as F

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)

instance F.Foldable Tree where
    foldMap f EmptyTree = mempty
    foldMap f (Node x l r) = F.foldMap f l `mappend` f x `mappend` F.foldMap f r

fというのは、任意の型をモノイドに変換する関数です。Sum, Product, Any, Allなどがあります。Treeの中に10より大きい要素があるかを調べるには、以下のようにすればよいです。

F.foldMap (\x -> Any $ x > 10) tree