我对 Scalaz 析取有一个理解。这些左侧的类型可以是来自其他库的不同类型的错误案例类。例如,一种失败情况可能是由于 HTTP 超时,而另一种可能表示 Play 中的 Json 解析错误。
有没有一种方法可以使用某种形式的类型类来声明“这 4 个类/特征都是这种类型的错误”,而实际上并不让它们继承自一个共同的特征?如果这确实存在,则还需要能够在 for 理解中进行推断。
我是scalaz的新手,但这就是我处理这个问题的方式:
定义我们的装饰器
sealed trait RequestError
case class ParseError(e: PlayJsonError) extends RequestError
case class HttpTimeoutError(e: NettyHttpError) extends RequestError
利用leftMap
val r: RequestError \/ Message = for{
a <- readHttpContent().leftMap(e => HttpTimeoutError(e))
b <- parse(a).leftMap(e => ParseError(e))
} yield(b)