Эта программа:
package domain
import cats.{Show, derived}
import cats.data.NonEmptyList
import cats.implicits._
case class Error(code: String, message: String)
case class Errors(errors: NonEmptyList[Error])
object ShowStuffApp {
// import NonEmptyList.catsDataShowForNonEmptyList
implicit val show: Show[Errors] = derived.semiauto.show
def main(args: Array[String]): Unit = {
val errors = Errors(NonEmptyList.one(Error("1234", "Could not process")))
val res = errors.show
println(res)
}
}
распечатывает:
Errors(errors = NonEmptyList(head = Error(code = 1234, message = Could not process), tail = Nil$()))
поэтому он автоматически создал экземпляр Show
для NEL, а не использовал закомментированный неявный экземпляр (который находится в области видимости, учитывая импорт верхнего уровня); документы по адресу https://github.com/typelevel/kittens?tab=readme-ov-file#user-content-derive-show утверждают, что существующие неявные выражения соблюдаются, но здесь это, похоже, не так . Раскомментирование внутреннего импорта не имеет никакого эффекта. Идеи?
Код был запущен в Scala 2.12.
Для класса Show
отсутствует экземпляр Error
и без него NonEmptyList.catsDataShowForNonEmptyList
бесполезен. Если вы добавите
implicit val showErrow: Show[Error] = derived.semiauto.show
в ваш код println
печатает следующее значение:
Errors(errors = NonEmptyList(Error(code = 1234, message = Could not process)))
Это случайно не Scala 3? Я считаю, что это известная проблема с автоматическим выводом Scala 3.