首页 > 解决方案 > Haskell - 将返回函子的函数应用到函子上

问题描述

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

标签: haskellcompositionfunctorapplicativefunction-composition

解决方案


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

也可以看看:


推荐阅读