Я пытаюсь установить представление, привязанное к высокодобному типу, и получаю сообщение об ошибке, которое я не могу понять.
$ scala -language:higherKinds
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_43).
Type in expressions to have them evaluated.
Type :help for more information.
scala> trait F[M[_]]
defined trait F
scala> def foo[M[_]](implicit m: M[_] => F[M]) = 42
foo: [M[_]](implicit m: M[_] => F[M])Int
scala> def bar[M[_] <% F[M]] = 42
<console>:8: error: type M takes type parameters
def bar[M[_] <% F[M]] = 42
^
Разве bar
не должен компилироваться так же, как foo
? Что мне не хватает?
1 ответ
Обратите внимание, что существует тонкое различие между M[_]
в списке параметров типа и типом M[_]
(т. Е. Ролью M[_]
в типе функции в неявном списке параметров). Первый - это параметр конструктора типа , а второй - экзистенциальный тип (см. Разделы 4.4 и 3.2.10 документа Спецификация языка Scala для получения дополнительной информации).
Так, например, мы могли бы заменить параметр конструктора типа M[_]
на M[X]
без изменения смысла, но в последнем случае это будет синтаксической ошибкой (которая вместо этого является сокращением для чего-то вроде M[X] forSome { type X }
).
Разница может быть более ясной в следующем примере (который отлично компилируется):
scala> def bar[M[_], M_ <: M[_] <% F[M]] = 42
bar: [M[_], M_ <: M[_]](implicit evidence$1: M_ => F[M])Int
Здесь первый M[_]
- параметр конструктора типа, а второй (верхняя граница M_
) - экзистенциальный тип.
Компилятор Scala мог бы предположительно заставить M[_] <% F[M]
работать так, как вы ожидаете, то есть он мог бы преобразовать параметр конструктора типа в экзистенциальный тип в типе неявного параметра, который он создает для привязки контекста, - но это бы требуется дополнительный небольшой кусочек магии компилятора, и этого уже достаточно, чтобы обойтись.
Похожие вопросы
Новые вопросы
scala
Scala - это язык программирования общего назначения, в основном предназначенный для виртуальной машины Java. Разработанный для краткого, элегантного и безопасного для типов представления общих шаблонов программирования, он сочетает в себе как императивный, так и функциональный стили программирования. Его ключевые особенности: продвинутая система статического типа с выводом типа; типы функций; сопоставления с образцом ; неявные параметры и преобразования; перегрузка оператора; полная совместимость с Java; совпадение