Monads和装饰图案

时间:2012-09-04 08:40:26

标签: java clojure monads

我是函数式编程的新手。在关注Monads的教程时,我认为它是OOP中Decorator模式的类比。我是正确的还是有任何与Monads非常相似的设计模式?

3 个答案:

答案 0 :(得分:7)

Monads绝对不是装饰者。常用的标准OOP模式不是monad的直接类比。虽然您可以在OOP中实现Monad,但请参阅例如:

我所知道的最好的基于Clojure的monad教程是Brian Marick的视频系列:

我建议观看这个 - 这是一个非常好的介绍,有很多例子。

答案 1 :(得分:2)

由于Haskell中已知的语法 - 糖,你可以开始考虑将monad称为“可覆盖的分号”

一般来说,这意味着您可以使用相同的控制结构(代码块)执行不同的操作,具体取决于当前使用的monad

Haskell中的qick示例

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]

如您所见,相同的代码块产生不同的结果 - 在一个案例中列出,在另一个案例中列出,包含在适当的数据结构中

答案 2 :(得分:-1)

Monads就像function composition on steroids,在OO世界中没有类似的强大概念。