Создание экземпляра Show для параметра типа? - PullRequest
0 голосов
/ 20 апреля 2020

Я работаю через Scala с Cats и пытаюсь создать 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].

Любые идеи о том, как я могу сделать это работа?

1 Ответ

3 голосов
/ 20 апреля 2020

По сути, я пытаюсь создать экземпляр, который, если у меня есть дерево, базовые значения которого имеют экземпляр 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)
      }
    }
}
...