Типовой класс для объединения несвязанных случаев отказа в моих дизъюнкциях Scalaz

У меня есть понимание дизъюнкций Scalaz. Левые типы на них могут быть разными типами классов ошибок из других библиотек. Например, один случай сбоя может быть связан с тайм-аутом HTTP, а другой может представлять собой ошибку синтаксического анализа Json в Play.

Есть ли способ использовать какую-либо форму класса типа для объявления «эти 4 класса/признака являются ошибкой такого типа», фактически не наследуя их от общего признака? Если это действительно существует, это также должно быть в состоянии быть выведено в пределах понимания.


person Mad Dog    schedule 01.11.2013    source источник


Ответы (1)


Я новичок в 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)
person Ben Aiad    schedule 07.07.2018