bind 函数看起来与组合函数非常相似。它有助于组合返回 monad 的函数。
关于 monad,还有什么比这个想法更有启发性的吗?
关于 monad,还有什么比这个想法更有启发性的吗?
是的,非常如此!
一元绑定是一种组合函数的方式,其中除了将函数应用于输入之外,还会发生其他事情。其他东西是什么取决于正在考虑的单子。
monad 是函数组合,Maybe
链中的一个函数可能会失败,在这种情况下,失败会自动传播到链的末尾。该表达式return x >>= f >>= g
适用f
于 value 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
,将这些应用程序的所有输出收集到一个大列表中。
其他单子代表各种其他上下文中的功能组合。非常简短:
Writer w
monad 是函数组合,类型的值被w
累积在一边。例如,通常w = [String]
(字符串列表)对日志记录很有用。
monad 是函数组合,Reader r
其中每个函数也可以依赖于 type 的值r
。这在为特定领域的语言构建评估器时很有用,r
可能是从变量名到语言中值的映射 - 例如,这允许简单地实现词法闭包。
State s
monad 有点像 reader 和 writer 的组合。它是函数组合,其中每个函数都可以依赖和修改 type 的值s
。
事实上,构图的观点本身就很有启发性。
Monads 可以看作是形式函数之间的一些“时髦组合” a -> Mb
。您可以通过 monad 操作将f : a -> M b
和组合g: b -> M c
成 something a -> M c
(只需绑定f
into的返回值g
)。
这会将形式的箭头转换为类别的a -> M b
箭头,称为 的Kleisli 类别M
。
如果M
不是一个 monad 而只是一个函子,你将只能 compose fmap g
and f
into something (fmap g) . f :: a -> M (M c)
。单子有join :: M (M a) -> M a
我让您定义为仅使用单子操作的(简单且有用的)练习(对于数学家来说,join
通常是单子定义的一部分)。然后join . (fmap g) . f
提供 Kleisli 类别的组成。
因此,可以看到 monadic 组合的所有 funk 发生在内部join
,join
代表副作用的组合:因为IO
它对效果进行排序,因为List
它连接列表,因为Maybe
它在结果为时“停止计算” Nothing
,因为Writer
它对写入进行排序,因为State
它对状态等操作进行排序。如果您了解类 C 语言,它可以被视为“可重载的分号”。以这种方式思考 monad 是非常有启发性的。
当然,Dan Piponi 比我解释得更好,下面是他的一些帖子,您可能会觉得很有启发性:http: //blog.sigfpe.com/2006/06/monads-kleisli-arrows-comonads-and。 html