Tip*_*ler 3 haskell composition functor function-composition applicative
假设我有两个函数f,g它们都接受常规值并返回一个Either像这样的值:
g :: a -> Either x b
f :: b -> Either x c
Run Code Online (Sandbox Code Playgroud)
我如何将两者链接在一起以获得类似的东西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
Run Code Online (Sandbox Code Playgroud)
这样我就可以做
applyToRight f (g a)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我专门谈论Either,但我认为这个问题可以推广到所有应用函子。处理这个问题的最优雅的方法是什么?
不适用。你重新发现了 Monadic 绑定:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
Either x 是一个单子:
> Left "a" >>= (\x -> Right (1+x))
Left "a"
> Right 1 >>= (\x -> Right (1+x))
Right 2
Run Code Online (Sandbox Code Playgroud)
使用 Kleisli 组合运算符(如f <=< g)或在另一个方向g >=> f上等效地使用前向组合运算符来链接两个创建 monad 的函数,就像您所做的那样,
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
Run Code Online (Sandbox Code Playgroud)
使用这个更容易理解这些类型:
f :: b -> Either x c
g :: a -> Either x b
-----------------------------------------
g >=> f :: a -> Either x c
Run Code Online (Sandbox Code Playgroud)
事实上,总结 monad 的一种方法是说它们是关于广义 函数组合的。
>=> 简单地定义为
(g >=> f) x = g x >>= f
(f <=< g) x = g x >>= f = f =<< g x
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |