私は、comparables要素を含むFoldableストラクチャに適用可能なmonoidであるmonoidのインスタンスを作成しようとしており、保存されたmaximun値を返します。任意のFoldable上の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)
を持っていることは、リスト上prefectly動作しますが、木にいくつかの問題があります。私は空のリストにそれを使用する場合]それは
ghci> foldMap (Max . Just) []
Max {getMax = Nothing}
を返し、それは[私が何をしたいのですが、私はノー要素
ghci> foldMap (Max . Just) (Node [] [])
Max {getMax = Just []}
と木の上にそれを使用するが、私はそれにしたいときだけではなく、Nothingを返します。それは無い子供を持つノードとopperateていませんが、それは大切なもの
ghci> foldMap (Max . Just) (Node 22 [Node 7 [Node 42 []], Node 18 [] ])
Max {getMax = Just 42}
任意の提案で動作しますか?
PD:私はData.Tree
でTree
タイプは空のツリーをサポートしていませんGHCiの7.10
'Node [] []'は空のツリーではなく、子を持たない単一のノードです。 – Lee
これはあなたが話しているツリータイプを明確にする必要があります。 – leftaroundabout
このモノイドは[monoid-extras](http://hackage.haskell.org/package/monoid-extras-0.4.0.4/docs/Data-Monoid-Inf.html)でも利用できます。 'mappend(Min x)(Min y)= Min(min x y)'は、このパッケージを使用する代わりに、 'Min'を自分で実装すると少し警告があります。 –