当然,数据类型并不准确,但这是否(或多或少)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
的原因是什么?的mappend
一个 OR
与 AND
相比?
最佳答案
有两种可能 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所说,实际上有四个有效实例
关于haskell - Haskell 中的 Monoid Bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581100/