向List添加方法并传递匿名参数

时间:2016-02-27 13:32:25

标签: scala pattern-matching

我有以下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))).

    }
}

我想做的是双重的:

  1. 在列表对象(dropWhile)上调用List(1,2,3,4,5).dropWhile([f: A => Boolean]),而不是使用List.dropWhile([List[A]], [f: A => Boolean])
  2. 传递一个匿名方法(i => i < 3),而不是定义函数smallerThanThree并传递它。
  3. 现在这给出了错误:

      

    错误:值dropWhile不是Main.List [Int]

    的成员

    匿名函数也不起作用。当我做的时候

    println( List.dropWhile(List(1, 2, 3, 4, 5), i => i < 3) )
    

    它给出了错误:

      

    错误:缺少参数类型

    有人可以解释是否可以完成上述两点,如果可以,怎么做?

1 个答案:

答案 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