2016-07-27 3 views
3

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

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

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

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

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

ответ

10

Синтаксис вопросительного знака исходит из плагина компилятора, который называется kind-projector.

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

Плагин транслирует

Kleisli[Id, R, ?] 

в (примерно)

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

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

+0

Что вы обозначаете здесь с помощью '# L'? Это выражение не компилируется для меня в Scala 2.11 – Matthias

+0

@Matthias L - это член типа, определенный внутри анонимного типа (т. Е. Блок {}). Он должен скомпилировать, какую ошибку вы получите? –

+0

': 1: error: ';' ожидаемый, но «#» найден. ' ' ({type L [A] = Либо [Int, A]}) # L' ^ – Matthias

Смежные вопросы