【问题标题】:Monads and Decorator pattern单子和装饰器模式
【发布时间】:2012-08-28 21:26:14
【问题描述】:

我是函数式编程的新手。在学习有关 Monads 的教程时,我不得不将其视为 OOP 中装饰器模式的类比。我是正确的还是有任何与 Monads 非常相似的设计模式?

【问题讨论】:

    标签: java clojure monads


    【解决方案1】:

    Monad 绝对不是装饰器。没有一个常用的标准 OOP 模式可以直接类比 monad。尽管您可以在 OOP 中很好地实现 monad,但请参见例如:

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

    我建议你仔细看一下——这是一个很好的介绍,有很多例子。

    【讨论】:

      【解决方案2】:

      由于 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,包装到适当的数据结构中

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这并不能说明什么。我不知道“类固醇的功能成分”是什么意思。这主要说明 monad 不像“装饰器”模式,因为它来自 OO 世界。附言我不懂单子,所以我不知道如何回答这个问题。
        • 正如 ivant 所说,对于刚接触 Monad 的人来说,这并没有告诉我任何关于 Monad 的信息。
        • 问题是关于将 monad 与 OO 世界中任何类似的设计模式进行比较。这不是说这个人知道单子,然后只有你可以将它与其他东西进行比较吗?这个问题不是关于解释moands,如果你想学习moands,请阅读各种可用的教程。我认为你们没有得到 moands 并在这个问题中看到了机会,因为它试图将 moands 与 OO 进行比较,很抱歉让您失望,但您无法通过将其与任何 OO 概念进行比较来学习 moands。
        猜你喜欢
        • 2011-07-18
        • 2013-07-01
        • 2014-10-29
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        相关资源
        最近更新 更多