gpt4 book ai didi

haskell - 为什么我们需要 Maybe Monad 而不是 Monad

转载 作者:行者123 更新时间:2023-12-03 20:16:15 26 4
gpt4 key购买 nike

我在玩 Maybe 和 Either monad 类型(链接,根据返回值应用条件函数,还返回链接函数失败的错误消息等)。所以在我看来,我们可以通过使用 Either monad 来实现与 Maybe 相同且更多的事情。所以我的问题是这些之间的实际或概念差异在哪里?

最佳答案

你当然是对的 Maybe aEither Unit a 同构.问题是它们通常在语义上用于表示不同的事物,有点像返回 null 之间的区别。并抛出 NoSuchElementException :

  • Nothing/None表示“预期的”缺少某些东西,而
  • Left e表示获取它时出现错误,无论出于何种原因。

  • 也就是说,我们甚至可以将两者结合起来:
    query :: Either DBError (Maybe String)

    我们表达了缺失值的可能性(DB NULL)和连接、DBMS 或其他任何错误的可能性(不是说没有更好的设计,但你明白了)。

    有时,边界是流动的;对于 saveHead :: [a] -> Maybe a ,我们可以说错误的预期可能性编码在函数的意图中,而像 saveDivide 这样的东西可能被编码为 Float -> Float -> Either FPError FloatFloat -> Float -> Maybe Float ,取决于用例(同样,只是一些愚蠢的例子......)。

    如果有疑问,最好的选择可能是使用带有语义编码的自定义结果 ADT(如 data QueryResult = Success String | Null | Failure DBError ),并且更喜欢 Maybe对于“传统上预期”的简单情况(这是一个主观点,但是如果您获得经验,这几乎可以)。

    关于haskell - 为什么我们需要 Maybe Monad 而不是 Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42554353/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com