haskell - 新类型的 Haskell Monoid 实例问题
问题描述
我正在尝试定义一个实例:
newtype Join a = Join { getJoin :: a -> Bool }
deriving Generic
instance Monoid (Join a) where
f <> g = ???
mempty = ???
目标是如果列表中的所有函数都为真,则函数 foldMap Join 应该返回 True,如果所有函数都不为真,则返回 false。
我了解 foldMap,以及 Monoid 的 Sum 和 Product 的实例,但是对于编写 Monoid 的新类型实例来说还是很陌生的。任何正确方向的帮助将不胜感激。谢谢你。
解决方案
True
如果第一个和第二个函数都返回,您可以True
使用(&&)
. 然后mempty
是一个适用于所有输入的Join
函数:True
instance Monoid (Join a) where
Join f <> Join g = Join (\x -> f x && g x)
mempty = Join (const True)
自从引入 后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)
推荐阅读
- c# - Powershell 实现 C# System.Diagnostics.Tracing.EventSource
- objective-c - 在 Objective-C(和 Swift)中,弱属性是线程安全的吗?
- python - 带有 TLS 的 Django LDAP3 安全性:我安全吗?
- c# - ASP.NET Core WebJob DI
- python - Python os.makedir 在使用 PyInstaller 编译为 exe 后不起作用?
- ios - Auth.auth().createUser(withEmail:emailTextField.text!,密码:passwordTextField.text!,完成:{(用户:用户?,错误:错误?)
- typescript - 为什么我得到属性不存在...如果我在另一个文件中使用 TypeScript 联合类型?
- javascript - 无法让 jquery tabledit 插件在多个表上工作
- flutter - 颤振导航问题
- sql - 如何创建一个像 Win+V 剪贴板历史一样工作的截图工具?