Просмотр границ над типами более высокого порядка

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

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


person aztek    schedule 16.03.2013    source источник


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

person Travis Brown    schedule 17.03.2013
comment
Спасибо за объяснение. Тем не менее, мне это кажется немного нелогичным. - person aztek; 17.03.2013