【问题标题】:Creating a Show instance on a type parameter?在类型参数上创建 Show 实例?
【发布时间】:2020-08-03 03:35:12
【问题描述】:

我正在使用 Cats 处理 Scala,我正在尝试在 Tree[A] 类型上创建 Show(不是书本练习)。基本上,我正在尝试创建一个实例,这样如果我有任何树的基础值具有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 ofshow.

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

当我只写了一个字符串"value" 进行测试时,我的Tree[Int] 实例无法在Tree[Int] 类型上找到方法show

关于如何完成这项工作的任何想法?

【问题讨论】:

    标签: scala implicit scala-cats


    【解决方案1】:

    基本上,我正在尝试创建一个实例,以便如果我有任何树的基础值具有 Show 实例。

    这是您问题的答案。
    只要您知道A 有一个Show,您就可以为Tree[A] 派生一个Show

    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)
          }
        }
    }
    

    【讨论】:

    • 猫为Show提供了字符串插值,所以你也可以写得更短:show"*\n/\n$left $right\n"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2014-09-05
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多