在类型参数上创建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实例?的主要内容,如果未能解决你的问题,请参考以下文章