Я пытаюсь установить представление, привязанное к высокодобному типу, и получаю сообщение об ошибке, которое я не могу понять.

$ 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? Что мне не хватает?

5
aztek 16 Мар 2013 в 14:23

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] работать так, как вы ожидаете, то есть он мог бы преобразовать параметр конструктора типа в экзистенциальный тип в типе неявного параметра, который он создает для привязки контекста, - но это бы требуется дополнительный небольшой кусочек магии компилятора, и этого уже достаточно, чтобы обойтись.

6
Travis Brown 17 Мар 2013 в 17:43
Спасибо за объяснение. Тем не менее, мне это кажется немного непоследовательным.
 – 
aztek
17 Мар 2013 в 23:33