Je vois ce code dans ce blog: Programmation au niveau du type dans Scala :
// define the abstract types and bounds
trait Recurse {
type Next <: Recurse
// this is the recursive function definition
type X[R <: Recurse] <: Int
}
// implementation
trait RecurseA extends Recurse {
type Next = RecurseA
// this is the implementation
type X[R <: Recurse] = R#X[R#Next]
}
object Recurse {
// infinite loop
type C = RecurseA#X[RecurseA]
}
Il y a un opérateur #
dans le code R#X[R#Next]
que je n'ai jamais vu. Comme il est difficile de le rechercher (ignoré par les moteurs de recherche), qui peut me dire ce que cela signifie?
scala
type-systems
Freewind
la source
la source
Réponses:
Pour l'expliquer, nous devons d'abord expliquer les classes imbriquées dans Scala. Prenons cet exemple simple:
Maintenant, essayons quelque chose avec:
Lorsque vous déclarez une classe dans une autre classe dans Scala, vous dites que chaque instance de cette classe a une telle sous-classe. En d' autres termes, il n'y a pas de
A.B
classe, mais il y aa1.B
et desa2.B
classes, et ils sont différents des classes, comme le message d'erreur nous dit ci - dessus.Si vous ne comprenez pas cela, recherchez les types dépendants du chemin.
Maintenant,
#
vous permet de faire référence à de telles classes imbriquées sans la limiter à une instance particulière. En d'autres termes, il n'y a pasA.B
, mais il y aA#B
, ce qui signifie uneB
classe imbriquée de n'importe quelle instance deA
.Nous pouvons voir cela dans le travail en modifiant le code ci-dessus:
Et l'essayer:
la source
Class
est une représentation d'exécution des classes Java, et elle est limitée même en Java. Par exemple,List<String>
etList<Integer>
ont le même runtimeClass
. Si ceClass
n'est pas assez riche pour représenter les types Java , il est presque inutile lors de la représentation des types Scala . Là encore, àres7: Class[A#B] = class A$B
gauche du signe égal se trouve un type, à droite du type égal s'il s'agit d'une valeur qui est la représentation d' exécution Java d'une classe.Elle est connue sous le nom de projection de type et est utilisée pour accéder aux membres de type.
la source
En gros, c'est une façon de faire référence à des classes au sein d'autres classes.
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (recherchez "dièse")
la source
Voici une ressource pour rechercher des "opérateurs symboliques" (qui sont vraiment des méthodes), mais je n'ai pas compris comment échapper à "#" pour rechercher dans scalex)
http://www.artima.com/pins1ed/book-index.html#indexanchor
la source