在Haskell中,bind运算符和Kleisli运算符有什么区别,它们之间有何关系?


回答 1:

我假设:

  • 'bind运算符'是单原子绑定:>> ='Kleisli运算符'是Kleisli箭头(又名'fish')的组成:> =>

首先,Kleisli箭头是形式的函数

a-> mb

对于一些单子。 我们可以用这种形式的两个箭头组成第三个箭头,就像普通的函数组成一样(参数的顺序除外)。 这是Kleisli箭头组合运算符(又称“鱼”):

(> =>)::(a-> mb)-第一个Kleisli箭头->(b-> mc)-第二个Kleisli箭头->(a-> mc)

如果我们选择使用return和join定义monad,则可以将其写为

[f> => g)x =连接(g <$> fx)

因为

(g <$> fx):: m(mc)

其中<$>是fmap的infix变体。 无点表示法:

f> => g =连接。 fmap g。 F

(回想一下,return包装了一个纯值,而join则删除了一层嵌套(m(ma)-> ma)。)

绑定运算符将Kleisli箭头应用于单值:

(>> =):: ma-单价->(a-> mb)-克莱斯里箭头-> mb

也可以根据返回和联接来定义:

mx >> = f =连接(f <$> mx)

同样,因为

[f <$> mx):: m(mb)

实际上,我们可以用“鱼”来定义绑定,反之亦然:

mx >> = f =(常量mx> => f)()(f> => g)x = fx >> = g