绑定功能看起来非常类似于合成功能。它有助于编写返回monad的函数。
对于单子而言,还有什么比这个想法更有启发性吗?
答案 0 :(得分:15)
对于单子而言,还有什么比这个想法更有启发性吗?
是的,非常如此!
Monadic绑定是一种组合函数的方法,其中其他正在函数应用程序之上和之上发生输入。 别的东西取决于所考虑的monad。
Maybe
monad是函数组合,可能链中的一个函数可能会失败,在这种情况下,失败会自动传播到链的末尾。表达式return x >>= f >>= g
将f
应用于值x
。如果结果为Nothing
(即失败),则整个表达式返回Nothing
,而不进行其他工作。否则,g
将应用于f x
并返回其结果。
Either e
monad,其中e
是某种类型,是函数组合,可能会因类型为e
的错误而失败。这在概念上类似于Maybe
monad,但我们可以获得有关故障发生方式和位置的更多信息。
List
monad是函数组合,可以返回多个值。如果f
和g
是返回输出列表的函数,则return x >>= f >>= g
将f
应用于x
,然后将g
应用于每个输出f
,将这些应用程序的所有输出收集到一个大列表中。
其他monad代表各种其他环境中的函数组合。非常简短:
Writer w
monad是函数组合,其值为w
,在侧面累积。例如,通常w = [String]
(字符串列表)对记录有用。
Reader r
monad是函数组合,其中每个函数也允许依赖于类型r
的值。这在为特定于域的语言构建评估程序时很有用,当r
可能是从变量名到映射中的值的映射时 - 例如,这允许简单地实现词法闭包。
State s
monad有点像读者和作家的组合。它是函数组合,允许每个函数依赖并修改s
类型的值。
答案 1 :(得分:6)
构成观点实际上本身就很有启发性。
Monads可以被视为a -> Mb
形式的函数之间的一些“时髦组合”。您可以通过monad操作将f : a -> M b
和g: b -> M c
组合成a -> M c
内容(只需将f
的返回值绑定到g
)。
这会将a -> M b
形式的箭头转换为类别的箭头,称为M
的 Kleisli类别。
如果M
不是monad而只是一个仿函数,那么您只能将fmap g
和f
组合成(fmap g) . f :: a -> M (M c)
。 Monads有join :: M (M a) -> M a
,我允许你只使用monad操作定义为(简单而有用)练习(对于数学家来说,join
通常是monad定义的一部分)。然后join . (fmap g) . f
提供Kleisli类别的组合。
因此可以看出所有monadic组合的恐惧都发生在join
内,join
代表副作用的组合:对于IO
它排序效果,List
它连接列表,Maybe
它“在结果为Nothing
时停止计算”,Writer
为State
排序写入,{{1}}如果你知道类C语言,它可以看作是一个“可重载的分号”。以这种方式思考monads是非常有益的。
当然,Dan Piponi比我更好地解释了这一点,这里有一些他可能会发现启发的帖子:http://blog.sigfpe.com/2006/06/monads-kleisli-arrows-comonads-and.html