haskell - Haskell - 将返回函子的函数应用到函子上
问题描述
假设我有两个函数f
,g
它们都接受常规值并返回如下Either
值:
g :: a -> Either x b
f :: b -> Either x c
我如何将两者链接在一起以获得类似的东西f . g
?
我想出的最佳解决方案是创建一个名为的辅助函数applyToRight
,其工作方式如下
applyToRight :: (a -> Either x b) -> Either x a -> Either x b
applyToRight f x =
case x of
Left a -> Left a
Right b -> f b
这样我就可以做到
applyToRight f (g a)
在这种情况下,我专门谈论Either
,但我认为这个问题可以推广到所有应用函子。处理这个问题的最优雅的方法是什么?
解决方案
不适用。您重新发现了 Monadic 绑定:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Either x
是一个单子:
> Left "a" >>= (\x -> Right (1+x))
Left "a"
> Right 1 >>= (\x -> Right (1+x))
Right 2
像你一样链接两个 monad 创建函数是使用 Kleisli 组合运算符完成的,例如f <=< g
,或者等效地在另一个方向g >=> f
上使用正向组合运算符,
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
这个类型更容易理解:
f :: b -> Either x c
g :: a -> Either x b
-----------------------------------------
g >=> f :: a -> Either x c
事实上,总结 monad 的一种方法是说它们是关于广义 函数组合的。
>=>
被简单地定义为
(g >=> f) x = g x >>= f
(f <=< g) x = g x >>= f = f =<< g x
也可以看看:
推荐阅读
- visual-studio - 如果可以的话,我可以在 Visual Studio 中使用 matlab 工具箱代码(k-wave)吗?我该如何实现?
- typescript - 从字符串日期中删除时间数据
- celery - 间歇性“无结果后端”异常
- neo4j - 使neo4j列表中存在的元素之间的所有关系
- html - Github 页面给了我 404 而不是链接到不同的页面
- python - 获取列中每个值的行数
- python - fbprophet:评估模型对数概率的错误:非有限梯度
- python - 在python中创建一个列来对数值进行分类
- reactjs - 导入功能组件时出错
- dropzone.js - 为什么 dropzoneJS 调整大小选项没有影响?