【发布时间】:2021-10-02 13:25:27
【问题描述】:
我有一个关于在面向对象语言中使用“Maybe”单子的问题。 也就是说,使用 monad 的“精神”说而不是编写如下代码:
return getUser(id).group.groupOwner.name
可能会因为空指针异常而在任何时候失败,我们改写它:
return Maybe.of(getUser(id))
.map( user => user.group )
.map( group => groupOwner )
.map( owner => name )
.orSome( "No Owner" )
这对我来说很清楚,编写这样的程序听起来很合理。
但后来我有了一个想法:假设我们正在编写的语言有一个NullPointerException 类,那么为什么不这样写上面的例子:
try {
return getUser(id).group.groupOwner.name
}
catch( NullPointerException e ) {
return "No Owner"
}
这段代码也有一个清晰的happy-path,看起来比带有monad的代码简单得多。
那么,在 OOP 中“Maybe”单子有什么用处吗?还是我没有考虑到的 monad 有什么优势?
【问题讨论】:
-
您刚刚将一个函数式习语应用于任意命令式代码。那没有意义。如果您对
try/catch感到满意,这只不过是变相的 goto,那么您不应该使用函数式习语。坚持一种范式就可以了。