haskell - Haskell 中的 Monoid Bool

标签 haskell monoids

当然,数据类型并不准确,但这是否(或多或少)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一个 ORAND 相比?

最佳答案

有两种可能 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/

相关文章:

haskell - Haskell Monad 法则如何从 Monoid 法则推导出来?

haskell - 当 foldr 与幺半群没有任何关系时, foldMap 怎么能做和 foldr 一样的事情呢?

haskell - monad只是endofunctors类别中的一个幺半群,有什么问题?

haskell - 在 Haskell 中编写汇编程序 - 带状态的 mapM?

macos - 在 Mac OS X 中链接动态库 (libjvm.dylib)(rpath 问题)

html - threepenny-gui - 打开文件

parsing - haskell - 解析/读取 .pdf 文件的内容

Haskell 错误 : "non-exhaustive patterns"

haskell - 单子(monad)只是内仿函数类别中的一个幺半群,有什么问题?

haskell - 在HXT中进行逻辑或运算而不重复结果