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
。
假设您有以下功能可供参考
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
。