0

Haskell で Monoid のインスタンスを作成しようとしています。これは、同等の要素を含み、保存されている最大値を返す 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)

リストでは完全に機能しますが、ツリーに問題があります。voidリストで使用すると返されます

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

それが私が望んでいることですが、要素のないツリーで使用すると

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

しかし、代わりに何も返さないようにしたい 子のないノードでは動作しませんが、値のあるノードでは動作します

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

なにか提案を?

PD: ghci 7.10 を使用しています

4

1 に答える 1

4

Treeタイプ inは空のData.Treeツリーをサポートしていません。GHCI にタイプを尋ねるNode [] []と、次のように表示されます。

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

あなたのモノイドはうまくいきます。

于 2016-05-04T23:20:00.703 に答える