Haskell - 应用将函子返回到函子上的函数

Tip*_*ler 3 haskell composition functor function-composition applicative

假设我有两个函数fg它们都接受常规值并返回一个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,但我认为这个问题可以推广到所有应用函子。处理这个问题的最优雅的方法是什么?

Wil*_*ess 7

不适用。你重新发现了 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 次

最近记录:

5 年,8 月 前