Почему я не могу запустить такой scala-код?(метод класса ReduRight List) - PullRequest
0 голосов
/ 07 июня 2018

Мой код:

abstract class List[T] {
  def reduceRight(op: (T, T) => T): Either[String, T] = this match {
    case Nil => Left("reduce on empty list")
    case x => Right(x)
    case x::xs => Right(op(x, xs, reduceRight(op)))
  }
}

Моя ошибка:

Тип шаблона несовместим с ожидаемым типом, dound: Nil.type, требуется: Список [T]

Я полный новичок в Scala, поэтому, пожалуйста, опишите свой ответ.

1 Ответ

0 голосов
/ 07 июня 2018

tldr: назовите свой класс как-нибудь еще, попросите метод взять второй параметр, который представляет собой список, который вы хотите сократить.

Проблема в том, что вы назвали свой класс List, который уже является именемкласс в Скале.Само по себе это на самом деле не нарушит код, но может вызвать некоторую путаницу в том, имеете ли вы в виду Scala List или свой собственный List.

. Затем вы перепутаете его и пытаетесь использоватьПользовательский класс, как будто это обычный Scala List.в частности, пытаясь использовать сопоставление с шаблоном с такими вещами, как Nil и ::.Они работают только на Scala List, а не на ваш.Конечно, вы могли бы также написать код для тех, кто будет работать с вашим пользовательским List, но вам все равно нужно быть осторожным, чтобы убедиться, что вы тоже ссылаетесь, я бы порекомендовал использовать другие имена, если вы пойдете по этому пути.

Более простое решение - присвоить классу другое имя, а затем изменить право Reduce, чтобы также взять в качестве параметра обычный List.Примерно так:

abstract class MyClass {
  def reduceRight[T](list: List[T], op: (T, T) => T): Either[String, T] = list match {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...