Ich habe den folgenden Code;Force-Typ-Parameter zu einem Merkmal
object main
{
def main(args: Array[String]): Unit =
{
trait E
{
def test(): Unit = println("test :)")
}
class B[T](val x: Int)
{
def inc(): B[T] with T = new B[T](x + 1) with T
}
class A[T](f : B[T] with T => Unit)
{
def apply(b: B[T] with T) = f(b)
}
val b = new B[E](0) with E
val a = new A[E](b => b.test())(b)
}
}
jedoch die Linie def inc(): B[T] with T = new B[T](x + 1) with T
nicht kompiliert, um den Fehler zu geben, dass „Klassentyp erforderlich, aber T gefunden“ und „T muss ein Merkmal sein, in mischen“. Ich verstehe, warum dies der Fall ist, aber ich kann keinen Weg finden, um es zu umgehen! Ich habe keinen Weg zu Constraint T
gefunden, um eine Eigenschaft zu sein, die mich Angst macht, dass dieser Ansatz nicht funktioniert ...
Um mehr Hintergrund zu geben, warum ich versuche, dies zu erreichen Jeder kann eine bessere Lösung anbieten) Ich habe eine Parsec[S, U, E, A]
Klasse, die aus Funktionen besteht, die ein State[S, U, E] with E
Objekt akzeptieren. Die Idee ist, dass U
ist ein Benutzer gegeben Zustand, A
ist das Ergebnis des Parsers, S
ein Strom von Token und E
ist eine Erweiterung des Staates (zum Beispiel könnte man eine Parsec[Stream[String, Char], Int, IndentationSensitive, List[Expr]]
usw. usw. erstellen möchten. Die U = Int
wäre etwas, das der Benutzer zum Beispiel zählen wollte, und das sollte nicht in den Zustand eingreifen müssen, der für die Indentationsempfindlichkeit erforderlich ist (was zwei Ints ist), die durch Mischen des Merkmals IndentationSensitive
bereitgestellt würde, wenn der Benutzer eine andere Funktionalität wünschte sie können weiter mischen in mehr Eigenschaften für die Parser.
Also, gibt es sowieso ich kann den Typ Parameter T
in den Code, so dass ich kann es in eine B
mischen, oder wenn nicht, gibt es einen besseren Weg zu erreichen, was ich brauche?
Wenn es wirklich nicht klar, was ich versuche dann this Frage auf Codereview zu erreichen stellt die Situation (in einem viel mehr Details). Aber Parsec[S <: Stream[_, _], U, A]
wird durch Parsec[S <: Stream[_, _], U, E, A]
und das gleiche für State und alle anderen Teile ersetzt.
Ich weiß es nicht sicher, aber ich erwarte, dass dies unmöglich ist. Mixins werden zur Kompilierzeit behandelt, aber dies würde eine dynamische Mischung erfordern. – puhlen
aber sicherlich könnte der Typ zur Kompilierzeit bekannt sein? Irgendwann wirst du einen konkreten Typ erreichen, wenn du die Typen genug auswählst? –
Dies ist nicht möglich. –