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如果是/不是,制作's mappendan ORvs的理由是什么AND

4

2 回答 2

17

有两种可能的Monoid情况Bool,因此Data.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所说,实际上有四个有效实例

于 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,单位AllTrue

于 2014-10-27T04:33:34.980 回答