Предположим, что для справки доступны следующие функции
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
Теперь рассмотрим следующую dropWhile
функцию, которая предположительно
удаляет элементы из префикса List
, если они соответствуют предикату.
def dropWhile[A](l: List[A], f: A => Boolean): List[A] =
l match {
case Cons(h, t) if f(h) => dropWhile(t, f)
case _ => l
}
У меня есть следующие тестовые случаи:
dropWhile(List(1, 2, 3), (x: Int) => x < 2) shouldBe List(2, 3)
dropWhile(List(1, 2, 3), (x: Int) => x > 2) shouldBe List(1, 2)
dropWhile(List(1, 2, 3), (x: Int) => x > 0) shouldBe Nil
dropWhile(Nil, (x: Int) => x > 0) shouldBe Nil
Вопрос
Контрольный пример (2) не пройден . Почему это так? Переводчик
на самом деле дает мне List(1, 2, 3)
оригинальный список, не имея
бросил что-нибудь.
Для контекста это Упражнение 3.5 по функциональному программированию в Scala
Чуйзано и Бьярнасон. Авторы сами реализуют это
функционировать точно так же, как я написал здесь. Есть
что-то, чего я здесь не понимаю?