这个节目:
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$()))
因此它自动派生了 NEL 的
Show
实例,而不是使用带注释的隐式实例(在给定顶级导入的范围内); https://github.com/typelevel/kittens?tab=readme-ov-file#user-content-derive-show 的文档指出现有的隐含内容受到尊重,但这里的情况似乎并非如此。取消注释内部导入没有任何效果。有想法吗?
也许缺少
Show
类的 Error
实例,并且 NonEmptyList.catsDataShowForNonEmptyList
没有它就没用。如果你添加
implicit val showErrow: Show[Error] = derived.semiauto.show
在您的代码中,
println
打印以下值:
Errors(errors = NonEmptyList(Error(code = 1234, message = Could not process)))