我有以下Scala代码来回答问题4(在列表上实现dropWhile,从列表前缀中删除元素,只要它们匹配谓词)Functional Programming In Scala的第3章:
object Chapter3 {
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
object List {
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
def dropWhile[A](l: List[A], f: A => Boolean): List[A] =
l match {
case Nil => sys.error("cannot drop from empty list")
case Cons(h, t) if f(h) => dropWhile(t, f)
case _ => l
}
}
def main(args : Array[String]) {
def smallerThanThree(i: Int): Boolean = i < 3
println( List.dropWhile(List(1, 2, 3, 4, 5), smallerThanThree) )
// How can I call this directly on the list with anonymous function like below?
println( List(1, 2, 3, 4, 5).dropWhile(i => i < 3) )
// => Should return List(3, 4, 5) or Cons(3, Cons(4, Cons(5, Nil))).
}
}
我想做的是双重的:
dropWhile
)上调用List(1,2,3,4,5).dropWhile([f: A => Boolean])
,而不是使用List.dropWhile([List[A]], [f: A => Boolean])
i => i < 3
),而不是定义函数smallerThanThree
并传递它。现在这给出了错误:
错误:值dropWhile不是Main.List [Int]
的成员
匿名函数也不起作用。当我做的时候
println( List.dropWhile(List(1, 2, 3, 4, 5), i => i < 3) )
它给出了错误:
错误:缺少参数类型
有人可以解释是否可以完成上述两点,如果可以,怎么做?
答案 0 :(得分:1)
为了能够在 trait git reset --hard HEAD~1
的实例上调用dropWhile
,该特征必须声明此功能。同名的对象包含此功能的事实并不会自动添加&#34;这种方法的特点。
您可以通过将特征定义更改为以下内容,轻松地将此类函数添加到List
特征:
List
然后,您建议的代码按预期工作。
至于传递匿名函数 - 在这种情况下,编译器不能自己推断 sealed trait List[+A] {
def dropWhile(f: A => Boolean): List[A] = List.dropWhile(this, f)
}
类型,因此必须显式写入类型,如下所示:
Int