【问题标题】:The "Maybe" monad and simple "try/catch" solution“Maybe”单子和简单的“try/catch”解决方案
【发布时间】: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,那么您不应该使用函数式习语。坚持一种范式就可以了。

标签: oop monads maybe


【解决方案1】:

您并不真正需要传统 OOP 语言(比如 java)中的 Maybe monad。就像你的例子一样,try/catch 块可以完成同样的事情。话虽如此,在像 Haskell 这样的语言中使用 Maybe monad(或者类似地,every monad)是最好的,因为它封装了任何副作用。

我喜欢考虑 may monad 的另一种方式是将它与 java 中的已检查异常进行比较。有关更多信息,请参阅 this 博客。基本上,就像检查异常一样,返回 monad 的函数“迫使”程序员思考如何处理错误。在我看来,这种设计有助于 Haskell 达到“一旦你的代码编译它通常就可以工作”的状态。有关该主题的更多信息,请参阅this quora 答案。

【讨论】:

    猜你喜欢
    • 2019-02-28
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2010-12-28
    相关资源
    最近更新 更多