2016-05-04 14 views
0

私は、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.TreeTreeタイプは空のツリーをサポートしていませんGHCiの7.10

+2

'Node [] []'は空のツリーではなく、子を持たない単一のノードです。 – Lee

+0

これはあなたが話しているツリータイプを明確にする必要があります。 – leftaroundabout

+0

このモノイドは[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'を自分で実装すると少し警告があります。 –

答えて

4

を使用しています。 Node [] []の種類が何であるかをGHCiのを尋ねると、あなたはこのような何かを見つけることができます:

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

あなたのモノイドは正常に動作します。

+0

ただし、要素と一緒にリストに適用されるべきではありませんか? –

+0

これは要素のないツリーではありません。これは1つの要素を持つツリーで、要素は '[]'です。 –

+0

私はあなたに制約があるとは思わない( 'a => Tree [a]'は 'ConstraintKinds'が有効であっても' a'はこのコンテキストの制約ではないので無効です) –

関連する問題