Ich sehe diesen Code in diesem Blog: Typ-Level-Programmierung in 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]
}
#
Der Code enthält einen Operator, den R#X[R#Next]
ich noch nie gesehen habe. Wer kann mir sagen, was es bedeutet, da es schwierig ist, es zu suchen (von Suchmaschinen ignoriert)?
scala
type-systems
Freilauf
quelle
quelle
Antworten:
Um es zu erklären, müssen wir zuerst verschachtelte Klassen in Scala erklären. Betrachten Sie dieses einfache Beispiel:
Versuchen wir jetzt etwas damit:
Wenn Sie eine Klasse in einer anderen Klasse in Scala deklarieren, sagen Sie, dass jede Instanz dieser Klasse eine solche Unterklasse hat. Mit anderen Worten, es gibt keine
A.B
Klasse, aber es gibta1.B
unda2.B
Klassen, und sie sind verschiedene Klassen, wie die Fehlermeldung oben sagt.Wenn Sie das nicht verstanden haben, suchen Sie nach pfadabhängigen Typen.
Jetzt
#
können Sie auf solche verschachtelten Klassen verweisen, ohne sie auf eine bestimmte Instanz zu beschränken. Mit anderen Worten, es gibt keineA.B
, aber es gibtA#B
eineB
verschachtelte Klasse einer beliebigen Instanz vonA
.Wir können dies in der Arbeit sehen, indem wir den obigen Code ändern:
Und probieren Sie es aus:
quelle
Class
ist eine Laufzeitdarstellung von Java-Klassen und selbst in Java eingeschränkt. Zum BeispielList<String>
undList<Integer>
haben die gleiche LaufzeitClass
. WennClass
es nicht reich genug ist, um Java- Typen darzustellen , ist es bei der Darstellung von Scala- Typen fast nutzlos . Wiederum istres7: Class[A#B] = class A$B
links vom Gleichheitszeichen ein Typ, rechts vom Gleichheitszeichen, wenn ein Wert die Java- Laufzeitdarstellung einer Klasse ist.Es wird als Typprojektion bezeichnet und für den Zugriff auf Typmitglieder verwendet.
quelle
Grundsätzlich ist es eine Möglichkeit, auf Klassen innerhalb anderer Klassen zu verweisen.
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (Suche nach "Pfund")
quelle
Hier ist eine Ressource für die Suche nach "symbolischen Operatoren" (die wirklich Methoden sind), aber ich habe nicht herausgefunden, wie ich "#" entkommen kann, um in scalex zu suchen.)
http://www.artima.com/pins1ed/book-index.html#indexanchor
quelle