C. *_*ann 41
实际上,在某种程度上,join所有魔法真正发生(>>=)的地方 - 主要用于方便.
所有Functor类型的类都使用某种类型来描述其他结构.有了Functor这个额外的结构通常被认为是一个"容器",虽然Monad它往往被认为是"副作用",但那些只是(偶尔误导)短背 - 无论是哪种方式都是一样的,而不是什么特别的[0].
Monad与其他Functors 相比的显着特征是它可以将控制流嵌入额外的结构中.它可以做到这一点的原因是,与fmap整个结构上应用单个平面函数不同,(>>=)检查单个元素并从中构建新结构.
对于平原Functor,从原始结构的每个部分构建新结构将代替嵌套Functor,每个层代表控制流的点.这显然限制了效用,因为结果是混乱的,并且具有反映所使用的流量控制结构的类型.
Monadic"副作用"是具有一些附加属性的结构[1]:
该join功能只不过是分组操作:嵌套的monad类型m (m a)描述了两个副作用及其出现的顺序,并将join它们组合成一个副作用.
因此,就monadic副作用而言,绑定操作是"获取具有相关副作用的值和引入新副作用的函数的简写,然后将函数应用于值,同时组合每个的副作用" .
[0]:除外IO.IO是非常特殊的.
[1]:如果你将这些属性与Monoid你的实例的规则进行比较,你会看到两者之间的相似之处 - 这不是巧合,实际上是什么"只是在endofunctors类别中的幺半群,什么是问题?" 线是指.
Pet*_*ley 27
什么加入并已经充分的被其他答案到目前为止所描述的,我想.如果你正在寻找一个更直观的理解......如果你想知道什么是"联系"意味着......那么不幸的是,答案将根据所讨论的monad而有所不同,特别是M(X)的意思"和M(M(X))"是什么意思".
If M is the List monad, then M(M(X)) is a list of lists, and join means "flatten". If M is the Maybe monad, then an element of M(M(X)) could be "Just (Just x)", "Just Nothing", or "Nothing", and join means to collapse those structures in the logical way to "Just x", "Nothing", and "Nothing" respectively (similar to camccann's answer of join as combining side effects).
对于更复杂的monad,M(M(X))变成一个非常抽象的东西,并决定M(M(X))和连接"mean"变得更复杂.在每种情况下,它都有点像List monad的情况,因为你将两层Monad抽象折叠成一层,但意义会有所不同.对于State monad来说,camccann将两个副作用结合起来的答案就是:连接本质上意味着结合两个连续的状态转换.Continuation monad特别是脑力破碎,但数学上的连接实际上相当简洁:M(X)对应于X的"双重双空间",数学家可能会写为X**(连续本身,即X-> R的地图,其中R是一组最终结果,对应于单个双空格X*),X****到X**.Continuation monad满足monad定律的事实对应于数学事实,即通常没有太多意义将双空间算子应用*两次以上.
但我离题了.
就个人而言,我试图抵制将一个类比应用于所有可能类型的monad的冲动; monad是一个过于笼统的概念,不能用一个描述性的类比来归类.什么联接意味着取决于您在任何给定时间使用的类比.
从同一页面我们可以恢复这些信息join x = x >>= id,了解这些信息bind和id功能如何工作,你应该能够弄清楚join它的作用.
| 归档时间: |
|
| 查看次数: |
11132 次 |
| 最近记录: |