Когда я пишу функцию вроде def foo[A,B]
, что именно означает [A,B]
? Я знаю, что это Polymorphic Method; но когда вы используете foo [A]
против foo [A,B]
?Что именно означает def foo [A, B]? Тип затенения
Вот пример, когда я не понимаю разницы. Эта функция составляет:
def map[B](f: A => B): Stream[B] =
foldRight(empty[B])((h,t) => cons(f(h), t))
Принимая во внимание, что этот не компилируется. Я не понимаю, почему A
не требуется, ведь A
ссылается на f: A => B
:
def map[A,B](f: A => B): Stream[B] =
foldRight(empty[B])((h,t) => cons(f(h), t))
[error] ..../Stream.scala:61: type mismatch;
[error] found : h.type (with underlying type A)
[error] required: A
[error] foldRight(empty[B])((h,t) => cons(f(h), t))
(это от одного из FP in Scala упражнений)
Добавление
Прочитав ответы, я добавляю некоторый контекст, чтобы помочь будущим читателям. Функция определена внутри признака:
trait Stream[+A] {
...
def map[B](f: A => B):Stream[B] =
foldRight(empty[B])((h,t) => cons(f(h), t))
...
}
Так что ошибка была вызвана типа затенения, но видеть @ отличный ответ acjay в поле ниже.
Googling scala type shadowing
не дает прямого определения ни в одном из документов scala, что интересно, потому что, как @travisbrown говорит ниже, это «один из самых распространенных источников замешательства новичка, который я видел». Здесь обсуждается: Why does Scala support shadow variables?
Где вы видели метод «map»? Если он является членом класса, сам класс может определить параметр типа 'A' – mucaho
Вы определяете' map' в классе, который определяет 'Stream [A]' (я предполагаю), поэтому абстрактный тип 'A' является уже определен и «map» должен иметь абстрактное имя для типа результата функции. – fedragon
Это означает, что вы определяете функцию, которая имеет дело с двумя разными типами, которые вы еще не знаете, и поскольку вы их не знаете, вы дадите им имена (A. B) в качестве заполнителей. Вы говорите компилятору, что, когда пользователь вызывает эту функцию, он должен заменить A и B правильными типами относительно места, где была использована функция. –