scala 中的数据共享 dropWhile 函数使用模式匹配

data sharing dropWhile function in scala using pattern matching

假设您有以下功能可供参考

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) 原始列表而没有 掉了任何东西。

对于上下文,这是 关于 Scala 函数式编程的练习 3.5 由 Chuisano 和 Bjarnason 撰写。作者自己实现了这个 功能与我在这里写的完全一样。在那儿 我在这里不理解的东西?

测试用例(2)错误。您正在 x > 2 时删除元素。由于第一个元素未通过此测试,因此它不会掉落任何东西。所以List(1, 2, 3)是正确的结果。

测试用例似乎是在测试 filterNot 而不是 dropWhile