新类型的 Haskell Monoid 实例问题

Thu*_*ird 7 haskell monoids deriving newtype derivingvia

我正在尝试定义一个实例:

newtype Join a = Join { getJoin :: a -> Bool }
   deriving Generic

instance Monoid (Join a) where
   f <> g = ???
   mempty = ???
Run Code Online (Sandbox Code Playgroud)

目标是如果列表中的所有函数都为真,则函数 foldMap Join 应该返回 True,如果所有函数都不为真,则返回 false。

我了解 foldMap 以及 Monoid 的 Sum 和 Product 实例,但对于编写 Monoid 的 newtype 实例我还是很陌生的。任何在正确方向上的帮助将不胜感激。谢谢你。

Wil*_*sem 9

True如果第一个和第二个函数都返回True,您可以使用(&&). 然后mempty是一个用于所有输入的Join函数True

instance Monoid (Join a) where
    Join f <> Join g = Join (\x -> f x && g x)
    mempty = Join (const True)
Run Code Online (Sandbox Code Playgroud)

由于引入了Semigroup,该(<>)函数是Semigroup然而的一个实例:

import Control.Applicative(liftA2)

instance Semigroup (Join a) where
    Join f <> Join g = Join (liftA2 (&&) f g)

instance Monoid (Join a) where
    mappend = (<>)
    mconcat js = Join (\x -> all (($ x) . getJoin) js)
    mempty = Join (const True)
Run Code Online (Sandbox Code Playgroud)