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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在类型参数上创建Show实例?相关的知识,希望对你有一定的参考价值。

我正在通过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"*
/
${show(left)} ${show(right)}
"
         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].

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

答案

基本上,我试图创建一个实例,如果我有任何一棵树,它的底层值有一个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"*
/
${show(left)} ${show(right)}
"
        case Leaf(value) => aShow.show(value)
      }
    }
}

以上是关于在类型参数上创建Show实例?的主要内容,如果未能解决你的问题,请参考以下文章

创建片段而不从 java 代码实例化它

Scala的下一步

CPNtools协议建模安全分析---实例变迁标记

使用 Terraform 代码创建 Ec2 实例,其中私钥将存储在 AWS 参数存储中(类型-安全字符串)

创建片段的新实例时菜单未膨胀

片段 null 必须是公共静态类才能从实例状态正确重新创建