функция dropWhile совместного использования данных в scala с использованием сопоставления с образцом - PullRequest
0 голосов
/ 25 мая 2019

Предположим, что для справки доступны следующие функции

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 Чуйзано и Бьярнасон. Авторы сами реализуют это функционировать точно так же, как я написал здесь. Есть что-то, чего я здесь не понимаю?

1 Ответ

4 голосов
/ 25 мая 2019

Тестовый пример (2) неверен. Вы сбрасываете элементы, пока x > 2. Поскольку первый элемент не проходит этот тест, он ничего не пропускает. Так что List(1, 2, 3) - это правильный результат.

Похоже, что в тестовом примере проверяется filterNot, а не dropWhile.

...