Scala: вопросительные знаки в параметрах типа

Я пытаюсь понять следующий фрагмент кода (из библиотеки Scalaz):

def kleisliIdApplicative[R]: Applicative[Kleisli[Id, R, ?]] = ...

Я предполагаю, что тип формы T[P0, ?] является конструктором типа, который принимает параметр. Однако я не могу найти документацию, объясняющую использование вопросительных знаков в параметрах типа.

Связанный с этим вопрос: в чем разница между вопросительным знаком и подчеркиванием?

Есть ли место, где все это хорошо задокументировано?


person Damian Nadales    schedule 27.07.2016    source источник


Ответы (1)


Синтаксис вопросительного знака взят из подключаемого модуля компилятора под названием kind-projector.

Вы можете увидеть, как он включен в сборку scalaz здесь: https://github.com/scalaz/scalaz/blob/series/7.3.x/project/build.scala#L310

Плагин переводит

Kleisli[Id, R, ?]

в (примерно)

({type L[A] = Kleisli[Id, R, A]})#L

что является довольно запутанным способом (но, к сожалению, единственным способом в Scala) выражения лямбда-типа, то есть частично применяемого конструктора типа.

person Gabriele Petronella    schedule 27.07.2016
comment
Что вы здесь обозначаете #L? Это выражение не компилируется для меня в Scala 2.11 - person Matthias; 27.08.2016
comment
@Matthias L — это член типа, определенный внутри анонимного типа (т. е. блока {}). Он должен скомпилироваться, какую ошибку вы получаете? - person Gabriele Petronella; 27.08.2016
comment
то есть он спотыкается о # - person Matthias; 27.08.2016
comment
синтаксис выглядит правильно, возможно, вы используете его в неправильном контексте? Также обратитесь к stackoverflow.com/questions/8736164/ - person Gabriele Petronella; 27.08.2016
comment
Ах, понял — я предполагал, что вы можете ссылаться на вложенный тип из любого контекста через #, но это работает только внутри списка аргументов типа [A, B, ...]. Спасибо. - person Matthias; 28.08.2016