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 实例我还是很陌生的。任何在正确方向上的帮助将不胜感激。谢谢你。
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)