就 OOP 程序员可以理解的(没有任何函数式编程背景)而言,什么是 monad?
它解决了什么问题,最常见的地方是什么?
更新
为了澄清我正在寻找的那种理解,假设您正在将具有 monad 的 FP 应用程序转换为 OOP 应用程序。您将如何将 monad 的职责移植到 OOP 应用程序?
最佳答案
为什么我们需要单子(monad)?
f(x) = 2 * x
g(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
(连接/组合 g
到 f
)。我们要 >>=
获取 g
的输出,检查它,如果它是 Nothing
只是不要打电话f
并返回 Nothing
;或者相反,提取盒装Real
和饲料 f
用它。 (这个算法只是 >>=
类型的 Maybe
的实现)。 g
的功能返回那些“装箱值”。 2. 有 Composer /链接者g >>= f
帮助连接g
的输出到 f
的输入,所以我们不必更改 f
一点也不。 StateMonad
. IO
单子(monad)。 总幸福!!!!
关于oop - 简单的英语单子(monad)? (面向没有FP背景的OOP程序员),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704652/