或者,尝试,并在Scala中验证
我对或者,尝试,并在Scala中验证,scala,error-handling,monads,scalaz,Scala,Error Handling,Monads,Scalaz,我对scalaz的或者尝试和验证感到困惑。他们似乎没有一个能满足我的需要。我需要的是一个简单的monadResult[E,R],其中E是错误类型,R是结果类型 或都不合适,因为它不是单子(但投影是)且无偏 Try不合适,因为它的错误类型是Throwable,并且它不完全是monad 验证根本不是单子 你有什么建议?我应该自己写这个结果吗键入?如果你愿意使用Scalaz(听起来像是这样),(通常发音为“disjunction”)正是你想要的-一元的、右偏的版本 它还包括许多其他优秀的东西,这些
scalaz
的或者尝试和验证感到困惑。他们似乎没有一个能满足我的需要。我需要的是一个简单的monadResult[E,R]
,其中E
是错误类型,R
是结果类型
或
都不合适,因为它不是单子(但投影是)且无偏
Try
不合适,因为它的错误类型是Throwable
,并且它不完全是monad
验证
根本不是单子
你有什么建议?我应该自己写这个结果吗
键入?如果你愿意使用Scalaz(听起来像是这样),(通常发音为“disjunction”)正是你想要的-一元的、右偏的版本
它还包括许多其他优秀的东西,这些东西不是通过标准库中的或的正确投影得到的(1.正确的语法,像++
这样的组合符,来自验证的转换器等)。使用任一投影。为什么Try
不是monad?它违反了什么单子定律?@paradigmatic-Try
为了安全而违反了单位定律,只有在抛出异常的情况下。如果你有f:A=>Try[B]
,那么Try(A)。根据单位定律,flatMap(f)
具有与f(A)
相同的行为。但是如果f(a)
抛出异常,Try
的flatMap
将捕获它。因此,在异常情况下,Try
是非一元的,因为一元性与异常的安全性是不可调和的。由于Try
的要点是异常安全,因此它有利于安全。(如果您将自己限制为不引发异常的输入,Try
是一个monad。)是的,尽管它现在被弃用,取而代之的是名称更为笨拙的\/.fromTryCatchThrowable
。