Scala: Как выполнить сопоставление с образцом по типу экземпляра, к которому вызывается метод? - PullRequest
3 голосов
/ 30 апреля 2020

Я пытался просмотреть подобные вопросы, не найдя ответа, и по какой-то причине я не могу найти что-либо через Google.

Допустим, у меня есть следующий тип списка:

sealed abstract class CustomList[T]
case class Nil[T]() extends CustomList[T]
case class Cons[T](head: T, tail: CustomList[T]) extends CustomList[T]

Теперь я хочу определить метод карты для этого типа списка, используя сопоставление с образцом, например, вот так:

def map[T1, T2](list: CustomList[T1], func: T1 => T2): CustomList[T2] = list match {
  case Nil() => Nil()
  case Cons(head, tail) => Cons(func(head), map(tail, func))
}

Это работает, если я просто объявляю какой-либо служебный объект и передаю список в качестве параметра, вот так:

val list = Cons(1,Cons(2,Cons(3,Nil())))
val mapped = CustomList.map(list, (x: Int) => x * x)

Но я хочу, чтобы он был в качестве метода для самого экземпляра класса, поэтому я могу сделать что-то вроде этого:

val list = Cons(1,Cons(2,Cons(3,Nil())))
val mapped = list.map((x: Int) => x * 2)

Так есть ли как я могу сделать сопоставление с образцом в списке, для которого я вызываю .map (), или мне не повезло?

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