Я пытаюсь создать экземпляр Monoid на haskell, моноид, который может быть применим к любой структуре Foldable, которая содержит сопоставимые элементы и возвращает сохраненное максимальное значение.
Пока у меня есть это
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)
Он отлично работает в списке, но есть некоторые проблемы с деревьями. Когда я использую его в пустом списке, он возвращается
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}
Любое предложение?
ПД: Я использую ghci 7.10
Node [] []
не пустое дерево, это единственный узел без дочерних элементов. - person Lee   schedule 05.05.2016Min
самостоятельно вместо использования этого пакета:mappend (Min x) (Min y) = Min (min x y)
не совсем правильно! - person Daniel Wagner   schedule 05.05.2016