繁体   English   中英

Haskell的Monoid Bool

[英]Monoid Bool in Haskell

当然数据类型并不精确,但这是(或多或少) 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 

如果是这样的话,是什么原因让Boolmappend成为ORAND

Bool有两个可能的Monoid实例,因此Data.Monoid有新的类型来区分我们打算使用哪一个:

-- | 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笔记

您提供的实例不是幺半群。

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

所以我们已经证明了F <> mempty === T ,但对于任何幺半群, x <> mempty === x

Any的单位为FalseAll的单位为True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM