6

bind 函数看起来与组合函数非常相似。它有助于组合返回 monad 的函数。

关于 monad,还有什么比这个想法更有启发性的吗?

4

2 回答 2

15

关于 monad,还有什么比这个想法更有启发性的吗?

是的,非常如此!

一元绑定是一种组合函数的方式,其中除了将函数应用于输入之外,还会发生其他事情其他东西是什么取决于正在考虑的单子。

  • monad 是函数组合,Maybe链中的一个函数可能会失败,在这种情况下,失败会自动传播到链的末尾。该表达式return x >>= f >>= g适用f于 value x。如果结果是Nothing(即失败),则整个表达式返回Nothing,没有其他工作发生。否则,g应用于f x并返回其结果。

  • Either emonad是某种类型,它e是函数组合,可能会因类型错误而失败e。这在概念上类似于Maybemonad,但我们可以获得更多关于失败发生的方式和位置的信息。

  • Listmonad 是函数组合,可以返回多个值。如果fg是返回输出列表的函数,则return x >>= f >>= g适用fx,然后适用g于 的每个输出f,将这些应用程序的所有输出收集到一个大列表中。

其他单子代表各种其他上下文中的功能组合。非常简短:

  • Writer wmonad 是函数组合,类型的值被w累积在一边。例如,通常w = [String](字符串列表)对日志记录很有用。

  • monad 是函数组合,Reader r其中每个函数也可以依赖于 type 的值r。这在为特定领域的语言构建评估器时很有用,r可能是从变量名到语言中值的映射 - 例如,这允许简单地实现词法闭包。

  • State smonad 有点像 reader 和 writer 的组合。它是函数组合,其中每个函数都可以依赖和修改 type 的值s

于 2012-06-02T11:50:40.710 回答
6

事实上,构图的观点本身就很有启发性。

Monads 可以看作是形式函数之间的一些“时髦组合” a -> Mb。您可以通过 monad 操作将f : a -> M b和组合g: b -> M c成 something a -> M c(只需绑定finto的返回值g)。

这会将形式的箭头转换为类别的a -> M b箭头,称为 的Kleisli 类别M

如果M不是一个 monad 而只是一个函子,你将只能 compose fmap gand finto something (fmap g) . f :: a -> M (M c)。单子有join :: M (M a) -> M a我让您定义为仅使用单子操作的(简单且有用的)练习(对于数学家来说,join通常是单子定义的一部分)。然后join . (fmap g) . f提供 Kleisli 类别的组成。

因此,可以看到 monadic 组合的所有 funk 发生在内部joinjoin代表副作用的组合:因为IO它对效果进行排序,因为List它连接列表,因为Maybe它在结果为时“停止计算” Nothing,因为Writer它对写入进行排序,因为State它对状态等操作进行排序。如果您了解类 C 语言,它可以被视为“可重载的分号”。以这种方式思考 monad 是非常有启发性的。

当然,Dan Piponi 比我解释得更好,下面是他的一些帖子,您可能会觉得很有启发性:http: //blog.sigfpe.com/2006/06/monads-kleisli-arrows-comonads-and。 html

于 2012-06-02T11:44:01.317 回答