Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell-将返回函子的函数应用到函子上_Haskell_Composition_Functor_Applicative_Function Composition - Fatal编程技术网

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 (>>=)