假设您具有以下可供参考的功能
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撰写。作者自己实现了这一点 功能与我在此处写的完全相同。在那儿 我在这里不明白的东西?
答案 0 :(得分:4)
测试用例(2)错误。您正在x > 2
期间删除元素。由于第一个元素未通过此测试,因此不会删除任何内容。因此List(1, 2, 3)
是正确的结果。
测试用例似乎正在针对filterNot
而不是dropWhile
进行测试。