monad是否只是组合函数的方式,否则不会构成?

lou*_*zer 6 monads haskell

绑定函数看起来像组合函数非常相似.它有助于编写返回monad的函数.

对于单子而言,还有什么比这个想法更有启发性吗?

Chr*_*lor 15

对于单子而言,还有什么比这个想法更有启发性吗?

是的,非常如此!

Monadic绑定是一种组合函数的方法,其中除了将函数应用于输入之外的其他事情发生之外.什么别的东西是取决于所考虑的单子.

  • Maybe单子与可能性,即在链中的功能中的一个可能会失败,在这种情况下,故障自动传播到链的末端功能的组合物.表达式return x >>= f >>= g适用f于该值x.如果结果是Nothing(即失败)则整个表达式返回Nothing,而没有其他工作发生.否则,g应用于f x并返回其结果.

  • Either e单子,其中e是某种类型的,与故障的类型的误差的可能性的功能组合物e.这在概念上与Maybemonad 相似,但我们可以获得有关故障发生方式和位置的更多信息.

  • List单子与返回多个值的可能性的功能的组合物.如果fg是返回的输出的列表功能,则return x >>= f >>= g适用fx,然后应用g到每个输出f,所有这些应用程序的输出收集到一起成为一个大名单.

其他monad代表各种其他环境中的功能组合.非常简短:

  • Writer w单子与类型的值功能组合物w的一侧上进行累计.例如,经常w = [String](字符串列表)对日志记录很有用.

  • Reader r单子是功能组合物,其中每个功能也允许取决于类型的值r.这在为特定于域的语言构建评估程序时非常有用,例如,r可能是从变量名称到语言中的值的映射 - 例如,这允许简单地实现词法闭包.

  • State s单子有点像读写器的组合.它是函数组合,其中允许每个函数依赖并修改类型的值s.


Ale*_* C. 6

事实上,构成观点本身就很有启发性.

Monads可以被视为表单功能之间的一些"时髦组合" a -> Mb.你可以通过monad操作组合f : a -> M bg: b -> M c进入某些东西a -> M c(只需绑定finto 的返回值g).

这接通形式的箭头a -> M b作为一个类别的箭头所示,被称为Kleisli类别M.

如果M不是一个单子,但只是一个仿函数,你会只能够撰写fmap gf到的东西(fmap g) . f :: a -> M (M c).Monads join :: M (M a) -> M a让我只使用monad操作定义为(简单且有用)练习(对于数学家来说,join通常是monad定义的一部分).然后join . (fmap g) . f提供Kleisli类别的组合.

因此可以看出所有monadic组合的funk发生在里面join,join表示副作用组成:因为IO它对效果进行排序,因为List它连接列表,因为Maybe它在结果为"停止计算"时NothingWriter它排序写入,对于State它的状态等操作序列,可以被看作是一个"重载分号"如果你知道类似C语言.以这种方式思考monads是非常有益的.

当然,Dan Piponi比我更好地解释了这一点,这里有一些他可能会发现启发的帖子:http://blog.sigfpe.com/2006/06/monads-kleisli-arrows-comonads-and. HTML