Haskell-将返回函子的函数应用到函子上
假设我有两个函数Haskell-将返回函子的函数应用到函子上,haskell,composition,functor,applicative,function-composition,Haskell,Composition,Functor,Applicative,Function Composition,假设我有两个函数f和g,它们都接受常规值并返回一个值,如下所示: g::a->x或b f::b->x或c 如何将这两者链接在一起以获得类似f的内容。g 我提出的最佳解决方案是创建一个名为applyToRight的助手函数,其工作原理如下 applyRight::(a->任意x b)->任意x a->任意x b 应用右f x= 案例十 左a->左a 右b->f b 这样我就可以 applyToRight f(g a) 在本例中,我专门讨论的是或者,但我认为这个问题可以推广到所有的应用函子。处
f
和g
,它们都接受常规值并返回一个值,如下所示:
g::a->x或b
f::b->x或c
如何将这两者链接在一起以获得类似f的内容。g
我提出的最佳解决方案是创建一个名为applyToRight
的助手函数,其工作原理如下
applyRight::(a->任意x b)->任意x a->任意x b
应用右f x=
案例十
左a->左a
右b->f b
这样我就可以
applyToRight f(g a)
在本例中,我专门讨论的是或者,但我认为这个问题可以推广到所有的应用函子。处理这个问题最优雅的方法是什么?不实用。您重新发现了一元绑定:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
任一x
都是单子:
> Left "a" >>= (\x -> Right (1+x))
Left "a"
> Right 1 >>= (\x -> Right (1+x))
Right 2
使用Kleisli复合运算符链接两个monad创建函数,如使用前向复合运算符链接f=>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
事实上,总结单子的一种方法是说它们是关于广义函数组合的
=>
的定义如下:
(g >=> f) x = g x >>= f
(f <=< g) x = g x >>= f = f =<< g x
(g>=>f)x=gx>>=f
(f>=f=f=Functor和Applicative都太弱:Monad包含您要查找的函数
applyToRight = flip (>>=)