作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 3 个不同的模块,每个模块都有自己的错误类型。以下是一个非常简化的版本。
object ModuleA {
case class ErrorA(msg: String)
def getA: ErrorA \/ String = "1".right
}
object ModuleB {
case class ErrorB(msg: String)
def getB(s: String): ErrorB \/ Int = 1.right
}
object ModuleC {
case class ErrorC(msg: String)
def getC(s: String, i: Int): ErrorC \/ Long = 1L.right
}
def call1: ModuleA.ErrorA \/ (ModuleB.ErrorB \/ (ModuleC.ErrorC \/ Long)) = {
ModuleA.getA.map { s =>
ModuleB.getB(s).map { i =>
ModuleC.getC(s, i)
}
}
}
Product \/ Long
)。理想情况下,需要与错误类型类似的东西
def call2 =
for {
s <- ModuleA.getA
i <- ModuleB.getB(s)
l <- ModuleC.getC(s, i)
} yield l
最佳答案
考虑从错误中创建代数数据类型,用于 example
sealed abstract class Error(val message: String)
case class ErrorA(msg: String) extends Error(msg)
case class ErrorB(msg: String) extends Error(msg)
case class ErrorC(msg: String) extends Error(msg)
\/
的左侧至
Error
import scalaz.\/
import scalaz.syntax.either._
object ModuleA {
def getA: Error \/ String = "1".right
}
object ModuleB {
def getB(s: String): Error \/ Int = ErrorB("boom").left
}
object ModuleC {
def getC(s: String, i: Int): Error \/ Long = 1L.right
}
for {
s <- ModuleA.getA
i <- ModuleB.getB(s)
l <- ModuleC.getC(s, i)
} yield l
res0: Error \/ Long = -\/(ErrorB(boom))
leftMap
将错误类型更改为像这样的常见类型
case class ErrorWrapper(m: String)
for {
s <- ModuleA.getA.leftMap { e: ModuleA.ErrorA => ErrorWrapper(e.msg) }
i <- ModuleB.getB(s).leftMap { e: ModuleB.ErrorB => ErrorWrapper(e.msg) }
l <- ModuleC.getC(s, i).leftMap { e: ModuleC.ErrorC => ErrorWrapper(e.msg) }
} yield l
// res0: ErrorWrapper \/ Long = -\/(ErrorWrapper(boom))
implicit class CommonErrorWrapper[A <: Product { def msg: String }](e: A) {
def toErrorWrapper: ErrorWrapper = ErrorWrapper(e.msg)
}
for {
s <- ModuleA.getA.leftMap(_.toErrorWrapper)
i <- ModuleB.getB(s).leftMap(_.toErrorWrapper)
l <- ModuleC.getC(s, i).leftMap(_.toErrorWrapper)
} yield l
// res1: ErrorWrapper \/ Long = -\/(ErrorWrapper(boom))
leftMap
不仅对于更改错误类型很有用,而且我们可以通过添加本地可用的上下文信息来丰富错误。
EitherT
当类型的形状为
F[A \/ B]
时,可以使用单子(monad)更改器(mutator)。 ,例如
Future[Error \/ B]
,但是在您的情况下,它只是
A \/ B
,因此
EitherT
这可能不是正确的工具。相关问题
EitherT with multiple return types
关于scala - 通过任一/析取 Scala 处理多种错误类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60313644/
使用cats.Semigroup可以这样写: import cats.Semigroup import cats.implicits._ val l1: String Either Int = Lef
所以我的网页中有两个字段,一个用于电话号码,另一个用于电子邮件地址,我需要使用 JavaScript 而不是 jQuery 来填写其中之一。我在这里找到的大多数答案都是针对 jQuery 的,任何使用
我有一个类型,它的形状是这样的: val myType: Future[Either[MyError, TypeA]] = // some value 我知道我可以对此进行模式匹配并获得 Right
我的印象是某处有 Either a 的实例,但我似乎找不到它。我尝试导入 Control.Monad、Control.Monad.Instances 和 Data.Either,如图所示 module
我在一个宠物 Scala 项目中遇到了一个我真的不知道如何克服的情况。 以下示例显示了我的问题。 import scala.concurrent.Future import scala.concurr
我是一名优秀的程序员,十分优秀!