【发布时间】:2014-02-11 05:48:06
【问题描述】:
为了澄清这个问题:这是关于 monad 类型类的优点(而不是没有统一类的实例)。
在阅读了许多参考资料后(见下文), 我得出的结论是,实际上,monad 类 可以解决仅一个但重大而关键的问题:具有上下文的类型上的函数“链接”。因此,著名的句子“单子是可编程的分号”。 其实一个monad可以看成an array of functions with helper operations。
我坚持monad的区别class,理解为其他类型的通用接口;以及这些实例化类的其他类型(因此,“一元类型”)。
我知道 monad 类本身只能解决运算符的链接,因为主要是它只要求它的类型实例
拥有bind >>= 和return,并告诉我们他们必须如何表现。作为奖励,编译器极大地帮助了为单子类型提供do 符号的编码。
另一方面,
每个单独的类型实例化了解决每个具体问题的 monad 类,但不仅仅是作为 Monad 的一个实例。例如Maybe 解决“函数如何返回值或错误”,State 解决“如何拥有具有全局状态的函数”,IO 解决“如何与外界交互”等等。所有这些类都在上下文中封装了一个值。
但迟早,我们将需要对此类上下文类型进行链接操作。即,我们需要按特定顺序组织对这些类型的函数的调用(有关此类问题的示例,请阅读You could have invented monads 中有关多值函数的示例)。
如果您将每种类型都作为 monad 类的实例,那么您就解决了链接问题。
要使链接正常工作,您需要 >>= 只需要它具有的确切签名,没有其他的。 (见this question)。
因此,我猜下次您定义上下文数据类型 T 来解决某些问题时,如果您需要对函数的调用(在 T 的值上)进行排序,请考虑将 T 设为 Monad 的实例(如果您需要“选择链接”,如果您可以从do 表示法中受益)。并确保您做对了,检查 T 是否满足 monad laws
然后,我向 Haskell 专家提出两个问题:
- 一个具体的问题:单子类是否有任何其他问题可以由 ifself 解决(除了单子类)?如果有的话,那么它与链接操作问题的相关性如何?
- 一个可选的一般性问题:我的结论是否正确,我是否误解了什么?
参考文献
教程
- Monads in pictures 绝对值得;请先阅读这篇文章。
- Fistful of monads
- You could have invented monads
- Monads are trees (pdf)
StackOverflow 问答
【问题讨论】:
-
只是为了澄清,你想知道 monad 类型类的优点(而不是没有统一类的实例)或 monad 概念(由 monad 操作和法律定义) ?
-
@ollanta 关于 monad 类型类的优点(与没有统一类的实例相反),
-
那么我会说它除了样板之外没有解决任何问题,就像所有类型类一样。我认为没有人会说 monad 类型类解决了 X 问题。相反,它具体化了 Haskell 中的一个有用概念,以便我们可以讨论 monad 上的函数(了解它们的可能性和限制),而不是类型上的函数以及实现专门协议的那些类型上的更多函数。一切都是为了让抽象变得美丽。
-
从给出的 2 个答案中:“monad 类允许其实例类型重用用于链接操作的代码,并使链接操作依赖于前一个操作的结果成为可能”。跨度>
标签: haskell functional-programming monads