【发布时间】:2012-08-28 21:26:14
【问题描述】:
我是函数式编程的新手。在学习有关 Monads 的教程时,我不得不将其视为 OOP 中装饰器模式的类比。我是正确的还是有任何与 Monads 非常相似的设计模式?
【问题讨论】:
我是函数式编程的新手。在学习有关 Monads 的教程时,我不得不将其视为 OOP 中装饰器模式的类比。我是正确的还是有任何与 Monads 非常相似的设计模式?
【问题讨论】:
Monad 绝对不是装饰器。没有一个常用的标准 OOP 模式可以直接类比 monad。尽管您可以在 OOP 中很好地实现 monad,但请参见例如:
我所知道的最好的基于 Clojure 的 monad 教程是 Brian Marick 的这个视频系列:
我建议你仔细看一下——这是一个很好的介绍,有很多例子。
【讨论】:
由于 Haskell 中已知的语法糖,您可以开始将 monad 视为“可覆盖的分号”
一般来说,这确实意味着您可以使用相同的控制结构(代码块)根据当前使用的 monad 执行不同的操作
Haskell 中的快速示例
import Data.Maybe
import Data.List
funcMaybe x = do
z <- x
return $ z * z
funcList x = do
z <- x
return $ z * z
runMaybe = funcMaybe ( Just 5 )
runList = funcList [ 5, 6 ]
在GHCI中执行,会提示
ghci> runMaybe
Just 25
ghci> runList
[25, 36]
如您所见,相同的代码块会产生不同的结果 - 在一种情况下是 List,在另一种情况下是 Maybe,包装到适当的数据结构中
【讨论】:
Monad 就像 function composition on steroids,在 OO 世界中没有类似的强大概念。
【讨论】: