Haskell的Monoid Bool

Kev*_*ith 4 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 
Run Code Online (Sandbox Code Playgroud)

如果是/不是,什么是做推理BoolmappendORAND

Gab*_*lez 15

有两种可能的Monoid实例Bool,因此新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)
Run Code Online (Sandbox Code Playgroud)

编辑:实际上有四个有效的实例,如Ørjan笔记

  • 实际上有四个.`(&&),(||),(==),(/ =)`都是可能的幺半群操作.但是,最后两个不是预定义的. (11认同)
  • @AndrewC 在我看来,`(==)` 实例的`True` 是`mempty`,`(/=)` 实例的`False` 是`mempty`。此外,在这种情况下,如果这两个 `mempty` 定律中的一个满足,另一个也满足,因为 `(==)` 和 `(/=)` 都是可交换的。 (2认同)
  • lkuty:其中八个不符合条件,因为他们的 `<>` 有 `T <> F /= F <> T`,这意味着 `F` 和 `T` 都不是 `mempty`。另外两个不符合条件,因为他们的 `<>` 有 `T <> F = F = T <> T`,这意味着 `F` 和 `T` 都不是 `mempty`。另外两个不符合条件,因为他们的 `<>` 有 `T <> F = T = F <> F`,这意味着 `F` 和 `T` 都不是 `mempty`。剩下的四个是`&&`、`||`、`==`和`/=`。 (2认同)

Joh*_*n L 5

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

mappend F mempty
mappend F T  -- by definition of mempty
T            -- by definition of mappend
Run Code Online (Sandbox Code Playgroud)

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

的单位AnyFalse,单位AllTrue