数据共享dropScala中使用模式匹配的功能

时间:2019-05-25 06:33:10

标签: scala functional-programming pattern-matching data-sharing

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

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撰写。作者自己实现了这一点 功能与我在此处写的完全相同。在那儿 我在这里不明白的东西?

1 个答案:

答案 0 :(得分:4)

测试用例(2)错误。您正在x > 2期间删除元素。由于第一个元素未通过此测试,因此不会删除任何内容。因此List(1, 2, 3)是正确的结果。

测试用例似乎正在针对filterNot而不是dropWhile进行测试。