Scala by Example - компоновка параметризованной функции границ границ жалуется - PullRequest
1 голос
/ 23 декабря 2011

Я хотел бы реализовать функцию параметризации типа в соответствии с размером упражнения на стр. 72 книги (реализовать с использованием фильтра):

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? Если так, то, честно говоря, я устал от бомбежек ТАК с такими глупыми вопросами на каждом втором упражнении. Кто-нибудь может порекомендовать книгу, которая четко отражает текущий порядок вещей?

1 Ответ

6 голосов
/ 23 декабря 2011

Вы уже дали ответ: Если вы хотите связать параметр типа B с другим параметром типа A , вы должны добавить его в список параметров типа:

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

Иначе вы имеете в виду что-то неопределенное.Может быть, это поможет, если вы думаете о параметрах типа как обычные (метод) параметры.Как что-то вроде следующего компиляции:

def add(x: Int) = x + y

Здесь параметр y не определен, как в вашем случае A был неопределен.

...