在类型参数上创建Show实例?

问题描述 投票:0回答:1

我正在通过Scala与Cats一起工作,并试图在类型参数上创建一个 "Show "实例。Show 关于 Tree[A] 类型(不是书本练习)。基本上,我试图创建一个实例,如果我有任何一棵树,其底层值有一个 Show 我可以调用 tree.show. 我正在为如何表达这个问题而苦恼。

到目前为止,我已经

sealed trait Tree[+A]
final case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A]
final case class Leaf[A](value: A) extends Tree[A]
object Tree {

 implicit val show: Show[Tree[Show[_]]] = new Show[Tree[Show[_]]] {
     def show(t: Tree[Show[_]]): String = t match {
         case Branch(left, right) => s"*\n/\n${show(left)} ${show(right)}\n"
         case Leaf(value) => value.show
        }
    }
}

我得到 missing argument list for method show in trait ContravariantShow Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing show _ or show(_) instead of显示.

当我改写为 value.show(_) 我得到了 type mismatch; found : _$3 => String required: String

当我只写了一串 "value" 检验,我 Tree[Int] 实例无法找到一个方法 show 关于类型 Tree[Int].

有什么想法可以让我把这个工作做好吗?

scala implicit scala-cats
1个回答
3
投票

基本上,我试图创建一个实例,如果我有任何一棵树,它的底层值有一个Show实例。

这就是您问题的答案。您可以导出一个 显示 对于 Tree[A] 只要你知道有一个 显示 对于 A.

object Tree {
  implicit def treeShow[A](implicit aShow: Show[A]): Show[Tree[A]] =
    new Show[Tree[A]] {
      override def show(t: Tree[A]): String = t match {
        case Branch(left, right) => s"*\n/\n${show(left)} ${show(right)}\n"
        case Leaf(value) => aShow.show(value)
      }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.