我正在尝试在 haskell 上创建一个 Monoid 的实例,该 Monoid 可适用于任何包含可比较元素并返回存储的最大值的可折叠结构。
到目前为止我有这个
import Data.List
import Data.Functor
import Data.Monoid
import Data.Foldable
import Data.Tree
newtype Max a = Max { getMax :: Maybe a}
deriving (Eq, Ord, Show, Read)
instance Ord a => Monoid (Max a) where
mempty = Max Nothing
mappend (Max x) (Max y) = Max (max x y)
它在列表中完美运行,但与 Trees 有一些问题。当我在 void list 上使用它时,它会返回
ghci> foldMap (Max . Just) []
Max {getMax = Nothing}
这就是我想要的,但是当我在没有元素的树上使用它时
ghci> foldMap (Max . Just) (Node [] [])
Max {getMax = Just []}
但我希望它返回 Nothing 而只是 []。它不适用于没有子节点的节点,但它适用于有价值的节点
ghci> foldMap (Max . Just) (Node 22 [Node 7 [Node 42 []], Node 18 [] ])
Max {getMax = Just 42}
有什么建议吗?
PD:我正在使用 ghci 7.10