2016-07-27 3 views
3

J'essaie de comprendre la pièce suivante de code (de la bibliothèque Scalaz):Scala: des points d'interrogation dans les paramètres de type

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

Je suppose qu'un type de forme T[P0, ?] est un type- constructeur qui prend un paramètre. Cependant, je ne suis pas en mesure de trouver la documentation qui explique l'utilisation des points d'interrogation dans les paramètres de type.

Une question connexe est quelle est la différence entre le point d'interrogation et un trait de soulignement?

Y a-t-il un endroit où tout cela est bien documenté?

Répondre

10

La syntaxe de point d'interrogation provient d'un plugin de compilateur appelé kind-projector.

Vous pouvez le voir être inclus dans la construction de scalaz ici: https://github.com/scalaz/scalaz/blob/series/7.3.x/project/build.scala#L226

Le plugin se traduit

Kleisli[Id, R, ?] 

en (environ)

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

qui est une façon assez alambiquée (mais malheureusement le seul moyen dans Scala) d'exprimer un type lambda, c'est-à-dire un constructeur de type partiellement appliqué.

+0

Qu'est-ce que vous dénotez ici avec '# L'? Cette expression ne se compile pas pour moi dans Scala 2.11 – Matthias

+0

@Matthias L est le membre de type défini dans le type anonyme (c'est-à-dire le bloc {}). Il devrait compiler, quelle erreur obtenez-vous? –

+0

': 1: erreur: ';' '({type L [A] = Soit [Int, A]}) # L' ^ – Matthias