根据我的阅读,我了解到 Monad 主要用于:
-函数组合
通过将一种函数输出类型与另一种函数输入类型相匹配。
我认为这是一篇非常好的文章:
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
它用盒子/包装器的概念解释了 Monad。但是我不明白这些 wrapper 是做什么用的?除了 Composition,Wrapper 有什么好处?
IO Monad 也是一个常见的例子。
name <- getLine -- name has the type String and getLine IO String
那么这种类型差异有什么好处呢?是错误处理吗?
将单子(monad)视为事物(名词)是一种混淆的根源。 Monad 更像是形容词。您不会问“蓝色”或“薄”有什么好处。您会找到一些有用的东西,例如一本蓝色的书或一支细笔,然后您会注意到一些图案 - 有些东西是蓝色的,有些很细,有些两者都不是。
与 monad 类似。要理解 monad,您应该首先对是 monad 的事物有一些经验:Maybe
、Either
、Reader
, 状态
。了解它们的工作原理、>>=
和 return
对它们的作用以及它们的用途,以及如何使用这些类型> 使用 Monad 类。 (因此,不要从 IO 开始。)然后您将准备好注意到这些不同类型之间的共性,并理解为什么它们遵循称为 Monad 的共同模式。
Monad 只是各种类型的有用接口(interface),但只有熟悉类型本身才能欣赏它,就像如果您从未见过蓝色就无法欣赏“蓝色”这个词一样东西。