Scala удаление элементов из списка - PullRequest
0 голосов
/ 12 февраля 2020

С учетом следующего списка:

  sealed abstract class IntList
  case class Empty()                        extends IntList 
  case class Element(n: Int, tail: IntList) extends IntList 
  • Определить функцию отбрасывания (n, xs).
    • Он должен вернуть список xs, без первых n элементов.

Это то, что я пробовал:

    def drop(n: Int, xs: IntList): IntList = xs match {
    case _ if n == 0 => xs
    case xs : Empty => Empty() 
    case xs : Element => Element(xs.tail.n, drop(n-1, xs.tail))
  }

но

error: value n is not a member of Solution.IntList
    case xs : Element => Element(xs.tail.n, drop(n-1, xs.tail))

Я предполагаю, что это потому, что xs.tail больше не гарантированно будет Element. Как мне это сделать? Спасибо.

1 Ответ

1 голос
/ 12 февраля 2020

Почти там, но нет необходимости заключать рекурсивный вызов в Element()

def drop(n: Int, xs: IntList): IntList = xs match {
  case _ if n == 0 => xs
  case xs : Empty => xs 
  case xs : Element => drop(n-1, xs.tail)
}

Это позволяет избежать необходимости вызывать xs.tail.n, который вы уже определили как проблему!

Вы также можете просто вернуть xs для Пустого случая, чтобы избежать создания нового экземпляра. Обычно можно использовать case object для пустого регистра, подобного этому.

...