alt*_*han 15 monads haskell functional-programming either maybe
我正在玩Maybe和Either monad类型(链接,根据返回值应用条件函数,还返回链接函数失败的错误消息等).所以我觉得我们可以通过使用Either monad来实现相同和更多的事情.那么我的问题是那些之间的实际或概念上的区别?
phi*_*ler 14
你当然Maybe a是同形的Either Unit a.问题在于它们通常在语义上用于表示不同的东西,有点像返回null和抛出之间的区别NoSuchElementException:
Nothing/ None表示某些东西的"预期"缺失,而Left e 无论出于何种原因,表示获取它的错误.也就是说,我们甚至可以将两者结合起来:
query :: Either DBError (Maybe String)
Run Code Online (Sandbox Code Playgroud)
我们表达了缺失值(DB NULL)的可能性和连接中的错误,DBMS或其他(不是说没有更好的设计,但你明白了).
有时,边界是流动的; 因为saveHead :: [a] -> Maybe a,我们可以说,错误的预期可能性是在函数的意图中编码的,而类似的东西saveDivide可能被编码为Float -> Float -> Either FPError Float或Float -> Float -> Maybe Float,取决于用例(再次,只是一些愚蠢的例子......).
如果有疑问,最好的选择可能是使用带有语义编码的自定义结果ADT(比如data QueryResult = Success String | Null | Failure DBError),并且更喜欢Maybe"传统上预期"的简单情况(主观点,但如果你获得经验,这将是最好的).
@ phg的答案很棒.在我学习它的时候,我会帮助我清理它:
Maybe 是一个(价值)或没有 - 即,你有一个价值或你什么都没有Either是一个逻辑分离,但你总是至少有一个(值) - 即,你有一个或另一个,但不是两个.Maybe非常适合您可能有或没有价值的地方 - 例如在列表中查找项目.如果列表包含它,我们(Maybe x)就得到了Nothing
Either是代码中分支的完美表示 - 它将以某种方式进行; Left或Right.我们使用助记符来记住它:Right是正确的(正确的)方式; Left是错误的方式(错误).这当然不是唯一的用途,但绝对是最常见的.
我知道这些差异一开始可能看起来很微妙,但实际上它们适用于非常不同的东西.