Ce qui ne l `#` opérateur de moyenne en Scala?
Je vois ce code dans ce blog: Au Niveau du Type de Programmation en 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 est un opérateur #
dans le code R#X[R#Next]
qui je n'ai jamais vu. Puisqu'il est difficile de le chercher(ignoré par les moteurs de recherche), qui peut me dire ce que cela signifie?
- le "dièse" est parfois appelé "octathrop" (que la recherche google m'a amené à cette page).
- Faire que dièse ou octothorp
- Whatabout d'autres opérateurs comme #+ et #- (voir github.com/tpolecat/doobie/blob/series/0.4.x/yax/h2/src/main/...)? Est-il une liste exhaustive?
Vous devez vous connecter pour publier un commentaire.
Pour expliquer cela, nous devons d'abord expliquer classes imbriquées en Scala. Considérons cet exemple simple:
Maintenant, nous allons essayer quelque chose avec elle:
Lorsque vous déclarez une classe à l'intérieur d'une autre classe dans Scala, vous dites que chaque instance de cette classe a une sous-classe. En d'autres termes, il n'y a pas
A.B
classe, mais il y aa1.B
eta2.B
classes, et ils sont différents classes, comme le message d'erreur nous dit ci-dessus.Si vous ne comprenez pas que, de rechercher chemin des types dépendants.
Maintenant,
#
rend possible pour vous de se référer à de telles classes imbriquées sans la restreindre à une instance particulière. En d'autres termes, il n'y a pasA.B
, mais il y aA#B
, ce qui signifie unB
classe imbriquée de tout instance deA
.Nous pouvons le voir dans le travail, en changeant le code ci-dessus:
Et de l'essayer:
Class
est un moteur d'exécution de la représentation des classes Java, et c'est limité, même en Java. Par exemple,List<String>
etList<Integer>
ont le même runtimeClass
. SiClass
n'est pas assez riche pour représenter Java types, il est presque inutile de représentant de Scala types. Encore une fois,res7: Class[A#B] = class A$B
, à gauche du signe égal est un type de, droite du signe égal, type si une valeur qui est la Java exécution représentation d'une classe.Il est connu comme le type de projection, et est utilisé pour l'accès des membres du type.
Fondamentalement, c'est une façon de se référer à des classes dans d'autres classes.
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (de la recherche pour "livre")
Voici une ressource pour la recherche sur la "symbolique des opérateurs" (qui sont vraiment des méthodes), mais je n'ai pas compris comment échapper "#" pour effectuer une recherche dans scalex)
http://www.artima.com/pins1ed/book-index.html#indexanchor