1

我想根据本书第 72 页的 excersize 实现一个类型参数化的函数(使用过滤器实现 forall):

def forallA[B <: A](xs:List[A])(f:A => B) : List[B] = {
    xs.filter(x => true) match {
        case Nil => Nil
        case y :: ys => f(y) :: forallA(ys)(f)
    }
}

但是,编译器(2.9.1)抱怨类型 A 未定义。显然不应该这样,因为同一本书中的多个示例都使用这种语法。该问题可以通过将函数类型参数更改为[A, B <: A]. 我是不是做错了什么,还是又是 Scala 语法规范的一个巨大变化?如果是这样,坦率地说,我厌倦了在每一秒的练习中用如此愚蠢的问题轰炸 SO。谁能推荐一本清楚地反映当前事物秩序的书?

4

1 回答 1

6

您已经给出了答案:如果要将类型参数B与另一个类型参数A绑定,则必须将其添加到类型参数列表中:

def forall[A, B <: A](...)(...) = ...

否则,您指的是未定义的东西。如果您将类型参数考虑为通常的(方法)参数,可能会有所帮助。应该如何编译以下内容:

def add(x: Int) = x + y

这里的参数y是未定义的,就像在你的情况下A是未定义的一样。

于 2011-12-23T09:46:24.100 回答