Использование параметризованной ветви ADT в функции - PullRequest
2 голосов
/ 18 июня 2020

Вот код:

sealed trait Tr
final case class A(a: String) extends Tr
final case class B(b: String) extends Tr

def markWithType[Type <: Tr](tr: Type): Type = tr match {
  //Compile error
  //Expression of type A doesn't conform to expected type Type
  case A(a) => A("A:" + a) 

  //Compile error
  //Expression of type B doesn't conform to expected type Type
  case B(b) => B("B:" + b)
}

Проблема в том, что он не компилируется. Я хочу сохранить Type <: Tr и успешно скомпилировать его. Есть ли способ сделать это?

Я почти уверен, что бесформенный может быть здесь полезен.

1 Ответ

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

Вы можете go с простой перегрузкой.

sealed trait Tr {
  def markWithType: Tr
}

final case class A(a: String) extends Tr {
  override def markWithType: A = A(s"A: ${a}")
}

final case class B(b: String) extends Tr {
  override def markWithType: B = B(s"B: ${b}")
}

Другой вариант - класс типов , но я считаю, что в данном случае это было бы излишним.

...