可能重复:
What is a monad?
您如何用非编程术语描述monad?编程之外是否存在一些概念/事物(在所有编程之外,而不仅仅是FP)可以说是以一种重要的方式行事或者像monad一样?
答案 0 :(得分:39)
是的,编程之外的一些东西可以说像monad。不,他们都不会帮助你理解单子。请阅读Abstraction, intuition, and the “monad tutorial fallacy”:
Joe Haskeller正在努力学习monads。在努力了解它们一周后,查看示例,编写代码,阅读其他人写的东西之后,他终于有了一个“啊哈!”的时刻:一切都突然变得清晰,乔理解Monads!当然,真正发生的事情是,乔的大脑将所有细节融合到一个更高层次的抽象中,这是乔可以用来直观地掌握单子的隐喻;让我们假设Joe的比喻是Monads就像Burritos。乔在这里严重误解了他自己的思维过程:“当然!”乔想。 “现在这一切都很简单。理解monad的关键是它们就像Burritos。如果我之前只想到过这个问题!“问题当然是,如果Joe HAD之前想过这个问题,那就不会有所帮助:细节挣扎的一周是形成Joe's Burrito直觉的必要和不可或缺的一部分,并非他未能及早发现这个想法的可悲后果。
但是现在乔去写了一个名为“Monads are Burritos”的monad教程,这是一个善意但错误的假设,即如果其他人阅读他的神奇洞察力,那么学习monad对他们来说将是一件轻而易举的事。 “莫纳德很容易,”乔写道。 “将它们视为墨西哥卷饼。”乔隐藏了所有关于类型的细节,因为这些都是可怕的,如果人们能够避免所有那些困难和混乱的东西,人们会学得更好。当然,恰恰相反,Joe所做的就是让人们更难了解monad,因为现在他们不得不花一个星期的时间来认为monad是卷饼并且完全混淆,然后一周试图忘记关于墨西哥卷饼的比喻,他们才能真正开始学习关于monads的事情。
正如我在another answer很久以前所说的那样,sigfpe的文章You Could Have Invented Monads! (And Maybe You Already Have.),以及Philip Wadler的原始论文Monads for functional programming,都是出色的介绍(不是类比,而是很多例子)但除此之外,你只是继续编码,最终它看起来都是微不足道的。
[不是一个真正的答案:一个地方monad存在于所有编程之外,当然,是数学。正如this hilarious post指出的那样,“monad是endofunctors类别中的幺半群,问题是什么?” : - )]
编辑:提问者似乎把这个答案解释为居高临下,说“Monads太复杂了,他们无法比喻”。事实上,没有任何类似的东西,而且它是often appear condescending的单子类比。也许我应该重申我的观点“你不必理解monads ”。你使用特定的monad是因为它们很有用 - 当你需要Maybe类型时使用Maybe monad,当你需要IO时使用IO monad,类似other examples和apparently in C#,你使用它可空<>现在,我们称之为monad的所有这些结构的单一通用抽象的洞察力并不是理解或使用特定monad所必需的。在你看到不止一个例子并认识到一种模式之后,这可以作为事后的想法:学习从具体到抽象。直接解释抽象,通过吸引抽象本身的类比,通常不会帮助学习者掌握它是什么的抽象。
答案 1 :(得分:24)
答案 2 :(得分:14)
在非编程术语中:
如果 F 和 G 是一对伴随仿函数, F 左边与 G 伴随,那么 GF 的成分是monad。
答案 3 :(得分:12)
在编程之外是否存在一些概念/事物(除此之外) 编程,而不仅仅是FP)可以说是行为或者是monad-like 重要的方式?
是的,实际上有。通过Curry-Howard同构的扩展,Monads与模态逻辑中的“可能性”直接相关。 (见:A Judgmental Reconstruction of Modal Logic.)
这是一个非常强大的关系,对我而言,与逻辑方面的可能性相关的概念比与类别理论中的单子相关的概念更直观。我发现向学生解释monad的最好方法是利用这种关系,但没有明确地表明同构。
基本思想是,如果没有monad,所有表达式都存在于同一个世界中,并且所有计算都在该世界中完成。但是对于monad来说,可能存在许多世界,并且计算在它们之间移动。 (例如,每个世界可能指定一些可变状态的当前值)
在这种观点中,monad p
意味着“在当今世界可能存在的世界中”。
特别是如果t
是一种类型,那么:
中获得
x :: t
表示当前世界中可以直接使用t类型的东西y :: p t
表示某个类型为t的东西可以从当前的
然后,return
允许我们将当前世界用作可达世界。
return :: t -> p t
>>=
允许我们在可达世界中利用某种东西,然后从那个世界到达其他世界。
(>>=) :: p t -> (t -> p s) -> p s
因此,>>=
可用于构建从较小路径到其他世界的可到达世界的路径。
随着世界变得像国家一样,这很容易解释。对于像IO monad这样的东西,它也很简单:一个程序与外部世界的所有交互都指定了一个世界。
对于非终止,两个世界就足够了 - 普通的,以及将来无限远的世界。 (对第二个世界应用>> =是允许的,但你不太可能观察到那个世界会发生什么。)对于延续monad,当正常使用延续时,世界仍然是相同的,并且还有额外的世界当它们不是时(例如,对于callcc)。
答案 4 :(得分:6)
Mike Vanier的this excellent post,
Haskell中的一个关键概念 这使它与众不同 编程语言就是这个概念 一个“monad”。人们似乎发现了这一点 很难学(我也这么做), 结果有很多 一些关于网络上的monad教程 这是非常好的(我特别 像杰夫的All About Monads一样 纽伯恩)。甚至有人这么说 写一个monad教程是一个仪式 新Haskell程序员的通道。 然而,许多人面临一个大问题 monad教程是他们尝试的 解释monads的参考 对读者的现有概念 已经明白了(我甚至已经看过了 这是Simon的演讲 Peyton-Jones,主要作者 GHC编译器和Haskell一般盛大 普巴尔)。这是一个错误,我是 要告诉你为什么。
在尝试解释时很自然 什么是什么,解释它 引用另一个人的事物 已经知道了。这很好用 当新事物在某些方面相似时 对方的事情方式 熟悉。它彻底崩溃了 当新事物完全消失时 这个人的经历 学习它。例如,如果你是 试图解释什么是火灾 从未见过火的穴居人, 你打算说什么? “有点像 空气和水之间的交叉,但是 热......“不是很有效。同样, 解释原子的含义 量子力学是有问题的, 因为我们知道电子 不会真正绕着轨道运行 像星球周围的行星一样, 以及“离域化”的概念 电子云“并不是真的意思 许多。费曼曾经说过没有人 真正了解量子力学, 并且在直观的层面上是真的。 但在数学上,量子 机械学很好理解;我们刚刚 对什么没有很好的直觉 数学真的意味着。
这与monads有什么关系?时间 再次,在教程,博客文章中 在Haskell邮件列表上,我已经 看到monads在其中一个中解释过 所谓直观的方式:monad是 “有点像行动”或“有点像 像一个容器“。怎么可能 既是行动又是容器? 这些不是这些概念吗?是一个 monad某种奇怪的“活跃 容器“?不,但重点是 声称monad是一种 行动或一种容器是 不正确。那么monad是什么呢?
这是答案: monad是一个 纯粹的抽象概念,没有 任何事物的基本关系 你可能听说过 之前。 Monad的概念来了 从类别理论,这是 最抽象的数学分支我 了解。事实上,整点 范畴理论是抽象出所有 数学结构的 揭露相似之处和类比 在看似不同的区域之间(for 例如,代数与代数之间 拓扑),以便凝聚 数学成其根本 概念,从而减少冗余。 (我可以继续讨论这个问题 虽然,但我宁愿回到 我正在尝试制作。)因为我 猜测大多数程序员 学习Haskell不太了解 范畴理论,monad不会去 对他们来说意味着什么。事实并非如此 意味着他们需要了解一切 类别理论在中国使用monads Haskell(幸运的是),但确实如此 意味着他们需要舒服 更多地思考事物 比他们可能的抽象方式 以前。
请转到帖子顶部的链接阅读完整文章。
答案 5 :(得分:5)
在实践中,我使用过的大多数monad都表现得像某种隐含的上下文。
就像你和朋友试图谈论共同的朋友一样。每当你说“Bob”时,你都指的是同一个Bob,而且由于Bob是你的共同朋友的背景,这个事实只是隐含在你的谈话中。
当然,您可以与您的老板(而不是您的朋友)讨论您的跳级管理员(而不是您的朋友)恰好被命名为Bob。在这里,您可以进行另一次对话,再次使用一些隐含的含义,这些含义只在对话的上下文中有意义。你甚至可以说出与你朋友完全相同的词语,但由于背景不同,它们会有不同的含义。
在编程中它是一样的。 tell
行为的方式取决于你所在的monad;信息汇编的方式(>>=
)取决于你所在的monad。同样的想法,不同的对话模式。
哎呀,即使谈话的规则也可以是monadic。 “不要告诉任何人我告诉你的内容”隐藏信息的方式与runST
阻止引用转义ST
monad的方式相同。显然,对话可以有层和层的上下文,就像我们有一堆monad变换器一样。
希望有所帮助。
答案 6 :(得分:3)
嗯,这里的a nicely detailed description of monads绝对不是所有节目。我知道它不在编程之中,因为我是一名程序员,我甚至不理解它所讨论的一半。
YouTube上还有一系列视频解释了这一类型的单子 - 这里是the first in the sequence。
我猜这不是你想要的,不过......
答案 7 :(得分:2)
我喜欢将它们视为可以“绑定”的计算抽象。或者,墨西哥卷饼!
答案 8 :(得分:2)
这取决于你与谁交谈。任何解释都必须在正确的层面上进行。我对化学工程师的解释与我对数学家或财务经理的解释不同。
最好的方法是将其与您正在与之交谈的人的专业知识联系起来。通常排序是一个相当普遍的问题,所以试着找到一个人知道你说“先做X,然后做Y”的地方。然后解释普通编程语言如何解决这个问题;如果你对计算机说“做X,然后做Y”它会立即做X和Y而不等待进一步的输入,但是在其他人的同时它不能做Z;计算机的“然后做”的想法与你的不同。因此,程序员必须以与您(专家)解释它的方式不同的方式编写程序。这会在你说的和程序说的之间产生差距。跨越这个差距需要花费时间和金钱。
Monads让你把你的“然后做”的版本放到电脑里,所以你可以说“做X然后做Y”,程序员可以写“do {x; y}”,这意味着什么你的意思是。
答案 9 :(得分:1)
是的,Monads来自haskell之外的概念。 Haskell有许多从类别理论中借用的术语和思想。这是其中之一。因此,如果这个不是程序员的人原来是一个研究过类别理论的数学家,那就说:“Monad是endofunctors类别中的幺半群。”