oop - 简单的英语单子(monad)? (面向没有FP背景的OOP程序员)

标签 oop functional-programming monads

就 OOP 程序员可以理解的(没有任何函数式编程背景)而言,什么是 monad?
它解决了什么问题,最常见的地方是什么?
更新
为了澄清我正在寻找的那种理解,假设您正在将具有 monad 的 FP 应用程序转换为 OOP 应用程序。您将如何将 monad 的职责移植到 OOP 应用程序?

最佳答案

为什么我们需要单子(monad)?

  • 我们要编程仅使用函数 . (毕竟是“函数式编程”-FP)。
  • 然后,我们遇到了第一个大问题。这是一个程序:
    f(x) = 2 * xg(x,y) = x / y
    怎么说首先要执行什么 ?我们如何仅使用函数来形成有序的函数序列(即 程序 )?

    解决方案:编写函数 .如果你想先g然后 f ,只需写f(g(x,y)) .好的,但是...
  • 更多问题:部分功能可能会失败 (即 g(2,0) ,除以 0)。我们有 FP 中没有“异常(exception)” .我们如何解决它?

    解决方案:让我们允许函数返回两种东西 : 而不是 g : Real,Real -> Real (从两个实数到一个实数的函数),让我们允许g : Real,Real -> Real | Nothing (函数从两个实数变为(实数或虚无))。
  • 但是函数应该(更简单)只返回 一件事 .

    解决方案:让我们创建一个新类型的数据来返回,一个“ 装箱类型”,它可能包含一个真实的或只是什么都没有。因此,我们可以有 g : Real,Real -> Maybe Real .好的,但是...
  • f(g(x,y)) 现在会发生什么? f尚未准备好使用 Maybe Real .而且,我们不想更改可以连接到 g 的每个函数。消费 Maybe Real .

    解决方法:让我们具有“连接”/“撰写”/“链接”功能的特殊功能 .这样,我们可以在幕后调整一个函数的输出来提供下一个函数。

    在我们的例子中:g >>= f (连接/组合 gf)。我们要 >>=获取 g的输出,检查它,如果它是 Nothing只是不要打电话f并返回 Nothing ;或者相反,提取盒装Real和饲料 f用它。 (这个算法只是 >>= 类型的 Maybe 的实现)。
  • 出现了许多其他问题,可以使用相同的模式解决: 1. 使用“盒子”来编码/存储不同的含义/值,并具有类似 g 的功能返回那些“装箱值”。 2. 有 Composer /链接者g >>= f帮助连接g的输出到 f的输入,所以我们不必更改 f一点也不。
  • 可以使用这种技术解决的显着问题是:
  • 具有函数序列中的每个函数(“程序”)可以共享的全局状态:解决方案 StateMonad .
  • 我们不喜欢“不纯函数”:对相同输入产生不同输出的函数。因此,让我们标记这些函数,使它们返回一个标记/装箱的值:IO单子(monad)。

  • 总幸福!!!!

    关于oop - 简单的英语单子(monad)? (面向没有FP背景的OOP程序员),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704652/

    相关文章:

    javascript - 在weakmaps中设置新值时我们会改变状态吗?

    c# - 你需要 ref 或 out 参数吗?

    haskell - 获取所有可能的邻居坐标

    oop - Scheme 可以与 Microsoft COM 一起使用吗?

    java - 如何将其变为 OOP

    scala - 函数式编程中的 for 与 map

    haskell - 在 Haskell 中模拟交互的有状态对象

    haskell - 为什么 <$> 和 <*> 以与 >>= 相反的顺序接受输入?

    haskell - 无法将类型 ‘a’ 与 Monad 实例定义中的 ‘b’ 错误匹配

    PHP/MySQL : How to get multiple values from a PHP database method