6

もちろん、データ型は正確ではありませんが、これは(多かれ少なかれ)どのようにMonoid Bool実装されていますか?

import Data.Monoid

data Bool' = T | F deriving (Show)

instance Monoid (Bool') where
    mempty = T
    mappend T _ = T
    mappend _ T = T
    mappend _ _ = F 

そう/そうでない場合、 を対にBoolする理由は何ですか?mappendORAND

4

2 に答える 2

17

には 2 つの可能なMonoidインスタンスがあるためBoolData.Monoidどちらを意図しているかを区別するための newtypes があります。

-- | Boolean monoid under conjunction.
newtype All = All { getAll :: Bool }
        deriving (Eq, Ord, Read, Show, Bounded, Generic)

instance Monoid All where
        mempty = All True
        All x `mappend` All y = All (x && y)

-- | Boolean monoid under disjunction.
newtype Any = Any { getAny :: Bool }
        deriving (Eq, Ord, Read, Show, Bounded, Generic)

instance Monoid Any where
        mempty = Any False
        Any x `mappend` Any y = Any (x || y)

編集:Ørjanが指摘するように、実際には4つの有効なインスタンスがあります

于 2014-10-27T04:18:17.893 に答える
5

提供されたインスタンスはモノイドではありません。

mappend F mempty
mappend F T  -- by definition of mempty
T            -- by definition of mappend

が証明されましF <> mempty === Tたが、任意のモノイドに対してx <> mempty === x.

の単位AnyFalse、 の単位はAllですTrue

于 2014-10-27T04:33:34.980 に答える