haskell - monad 中的纯映射
问题描述
假设我有两个功能
f :: Monad m => a -> m a
g :: a -> a
我想连续应用于某些元素,如下所示:
(return x) >>= f >>= g
这不起作用,因为 g 是纯的,所以我首先需要“人为地”将它变成一元的。一种可能是
(return x) >>= f >>= (return . g)
这对我来说不是很直观。另一种可能性是使用 Monad is Applicative:
(return g) <*> ((return x) >>= f)
但这不是很直观,因为函数和参数的顺序不同:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
处理此问题的规范方法是什么?如果(>>==) = (flip ((<*>) . pure))
一个人可以写((pure x) >>= f) >>== g
,除了运算符优先级之外,这很好。当然,单子代码中的纯函数是很常见的事情,所以肯定有一种标准的方法来处理它们吗?
编辑:我最初并没有这么说,但我在想一种情况,我有几个函数,一些是纯函数,一些是单子函数,我想以某种随机顺序应用它们。
解决方案
你这里描述的是fmap :: Functor f => (a -> b) -> f a -> f b
. 此外,由于pure x >>= f
应该与 相同f x
,因此我们可以将给定表达式简化为:
fmap g (f x)
或者我们可以使用中缀别名(<$>) :: Functor f => (a -> b) -> f a -> f b
:
g <$> f x
推荐阅读
- pandas - pandas:过滤列表元素以字符串开头的行?
- python - 如何在 Python 中合并一维和二维元组?
- postgresql - 如何在 Sequelize.js 的 where 子句中使用 if 条件
- dreamweaver - 如何正确放置字形图标右对齐和文本居中对齐
- django - Django根据用户浏览器设置设置小数点分隔符
- java - 解密 AES256 时出现 BadPaddingException
- r - 聚合和 cbind 函数说明
- mysql - MySQL 查询以返回相关重复项的列表
- android - 是否可以制作 2 个或更多 DataBindingComponent?
- reactjs - 组件方案