как распечатать коллекцию как действительный код в scala - PullRequest
1 голос
/ 18 июня 2020

Предположим, у меня есть

val x = List("a","b","c")

Я бы хотел иметь функцию f, которая при вызове возвращает

List("a","b","c")

В настоящее время println(x) просто печатает List(a,b,c) который не будет компилироваться при компиляции / вставке в Scala -Notebook или Unit-Test.

Я застрял, чтобы найти общее решение, которое также работает для Seq[Double] et c, мне удалось получить что-нибудь для Seq[String], повторно добавив кавычки, но я не могу найти подходящее решение для всех типов коллекций

1 Ответ

2 голосов
/ 18 июня 2020

Похоже, вам нужен класс нестандартного типа Show

trait Show[T] {
  def show(t: T): String
}
trait LowPriorityShow {
  implicit def default[T]: Show[T] = _.toString
}
object Show extends LowPriorityShow {
  implicit val str: Show[String] = s => s""""$s""""
  // other exceptions for element types
  implicit def list[T: Show]: Show[List[T]] = _.map(show(_)).mkString("List(", ",", ")")
  implicit def seq[T: Show]:  Show[Seq[T]]  = _.map(show(_)).mkString("Seq(", ",", ")")
  // other exceptions for collection types
}

def show[T](t: T)(implicit s: Show[T]): String = s.show(t)

val x = List("a","b","c")
show(x) //List("a","b","c")
val x1 = Seq("a","b","c")
show(x1) //Seq("a","b","c")

Вы можете попробовать заменить экземпляры для коллекций (Show.list, Show.seq ...) на более общие c

import shapeless.Typeable

implicit def collection[Col[X] <: Iterable[X], T: Show](implicit ev: Typeable[Col[_]]): Show[Col[T]] = {
  val col = Typeable[Col[_]].describe.takeWhile(_ != '[')
  _.map(show(_)).mkString(s"$col(", ",", ")")
}

Вам нужно будет проверить себя, всегда ли результатом является действительный код в Scala.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...