任何可折叠

时间:2016-05-04 22:54:37

标签: haskell monoids

我试图在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)

它在列表中完美运行但与树有一些问题。当我在void list上使用它时,它返回

ghci> foldMap (Max . Just) []
Max {getMax = Nothing}

这就是我想要的,但当我在没有元素的树上使用它时

ghci> foldMap (Max . Just) (Node [] [])
Max {getMax = Just []}

但我希望它返回Nothing而不是Just []。它没有使用没有孩子的节点,但它与有价值的节点配合使用

ghci> foldMap (Max . Just) (Node 22 [Node 7 [Node 42 []], Node 18 [] ])
Max {getMax = Just 42}

有什么建议吗?

PD:我正在使用ghci 7.10

1 个答案:

答案 0 :(得分:4)

Tree中的Data.Tree类型不支持空树。询问GHCI Node [] []的类型是什么,你会发现这样的事情:

Node [] [] :: a => Tree [a]

你的幺半群工作正常。