1
28
以下是我目前的尝试: 桶队模型 :
我很感谢你的支持,但遗憾的是,单子教程诅咒再次袭来。我所描述的只是带有容器的函数应用程序,而不是monad!但我不是虚无主义者我相信单子的诅咒可以被打破!所以这里有一个更,呃, 复杂的 我认为这幅画描述得更好一点。你决定是否值得带去见你的朋友。 与项目经理合作 . 项目经理们站在除了第一个队员以外的所有人后面。水桶大队的队员们坐在凳子上,面前摆着水桶。 第一个人收到一些东西,用它做一些事情,然后把它放进桶里。然后那个人把手拿开,不要交给旅里的下一个人,那太容易了!:-)而是站在那个人后面的项目经理。
绑定
,或
当下一个人做了一桶东西,这个人把它交给下一个项目经理。下一个项目经理再次弄清楚如何处理她给的桶,然后把桶里的东西交给她自己。最后,铲斗通过
后面
在项目经理的链条上,他们可以选择使用bucket(比如
在这种情况下
“但这太复杂了!为什么人们不能自己把桶卸下来呢。好吧,项目经理可以在幕后做一堆工作,否则会使人的工作复杂化。我们正试图让这些旅的成员轻松些,这样他们就不用做太多了。例如,在Maybe monad的例子中,每个人不必检查他们得到的东西的价值,看看他们是否得到了什么,项目经理会为他们处理这些。
. 不过,有时你希望一个人有更复杂的事情要做,他们希望对生产的桶有一些控制(例如,他们是否需要返回)
要点是:
我的睡前指导到此结束-P |
2
40
Abstraction, intuition, and the âmonad tutorial fallacyâ
就像我在书中说的 another answer 很久以前,sigfpe的文章 You Could Have Invented Monads! (And Maybe You Already Have.) Monads for functional programming ,都是很好的介绍(它提供的不是类比而是大量的例子),但除此之外,您只需继续编写代码,最终一切都会显得微不足道。 [这不是一个真正的答案:单子存在于所有编程之外的一个地方,当然是数学。作为 this hilarious post 指出,“单子是内函子范畴中的幺半群,有什么问题?”:—)] 编辑 often appear condescending . 也许我应该重申我的观点 other examples ,和 apparently in C# |
3
15
非编程术语: 如果 F 和 是一对伴随函子,具有 左伴随 ,然后是构图 G.F.公司 是单子。 |
4
12
是的,事实上有。单子与模态逻辑中的“可能性”有着非常直接的联系,它是Curry-Howard同构的推广(请参见: A Judgmental Reconstruction of Modal Logic. )
其基本思想是,没有单子,所有的表达式都存在于同一个世界,所有的计算都在这个世界上进行。但是对于单子,可以有许多世界,计算在它们之间移动(e、 例如,每个世界可能指定某个可变状态的当前值)
在这个视图中,单子
特别是如果
那么,
以及
所以呢
世界就像是州,这很容易解释。对于类似IO monad的东西,这也很简单:一个程序与外部世界的所有交互都指定了一个世界。 对于无终止的两个世界就足够了——一个普通的世界,一个无限遥远的未来(应用>>=第二个世界是允许的,但是你不太可能观察到在那个世界中发生了什么。)对于延续单元组,当延续被正常使用时,世界保持不变,当它们不被正常使用时,还有额外的世界(例如,对于callcc)。 |
5
6
this excellent post 作者:Mike Vanier,
请转到文章顶部的链接阅读全文。 |
6
5
在实践中,我接触过的大多数单子的行为都像某种隐含的上下文。 就像你和一个朋友在谈论一个共同的朋友。每次你说“鲍勃”,你们都是指同一个鲍勃,这一事实只是在你的谈话中含蓄地穿插,因为鲍勃是你共同的朋友。 当然,你可以和你的老板(不是你的朋友)谈谈你的跳级经理(不是你的朋友),他碰巧叫鲍勃。在这里你可以有另一个对话,同样有一些隐含的含义,只有在对话的上下文中才有意义。你甚至可以说出和你朋友说的完全一样的话,但是因为不同的语境,它们会有不同的含义。
在编程上也是一样的。就这样
见鬼,连谈话的规则都是一元的。”不要告诉任何人我告诉你的事“以同样的方式隐藏信息”
希望有帮助。 |
7
3
|
8
2
我喜欢把它们看作是可以“绑定”的计算的抽象。或者,玉米饼! |
9
2
这取决于你在和谁说话。任何解释都必须放在正确的层次上。我对化学工程师的解释和对数学家或财务经理的解释是不同的。 最好的方法是把它和你谈话的人的专业知识联系起来。作为一个规则排序是一个相当普遍的问题,所以试着找到一些人知道你说“先做X,然后做Y”。然后解释普通编程语言是如何遇到这个问题的;如果你对一台计算机说“做X,然后做Y”,它会立即做X和Y而不等待进一步的输入,但不能同时为其他人做Z;计算机的“然后做”的概念和你的不同。因此程序员必须以不同于你(专家)解释的方式来编写他们的程序。这在你说的话和程序说的话之间造成了差距。跨越这一鸿沟需要时间和金钱。
|
10
1
是的,Monads来自haskell之外的概念。哈斯克尔有许多术语和思想是从范畴理论中借用来的。这是其中之一。如果这个不是程序员的人是研究范畴论的数学家,就说:“单子是内函子范畴中的幺半群。” |
nanounanue · 使用python和高级操作符的函数管道 6 年前 |
Zazaeil · 这个特定的递归可以用尾部优化的方式重写吗? 6 年前 |
corvid · 使用ramda通过变量进行升序/降序 6 年前 |
CodingNow · Scala:如何制作多种方法并逐一应用? 6 年前 |