Biorąc pod uwagę następujące AST dla Success
i Failure
:ograniczające Rodzaj Podpisy dla lewego i prawego
sealed trait Success
case object FooGood extends Success
case object BarGood extends Success
sealed trait Failure
case object FooBad extends Failure
case object BarBad extends Failure
oraz podpis metoda:
def go[A <: Failure, B <: Success](x: Int): Either[A, B] = ???
Jednak chciałbym, aby ograniczyć Left
i Right
typy specyficzne dla Foo
lub Bar
.
ale następujący kod kompiluje (wbrew mojej woli):
scala> go[FooBad.type, BarGood.type](5)
scala.NotImplementedError: an implementation is missing
Jak mogę osiągnąć to ograniczenie w czasie kompilacji?
Dlaczego nie używając cechę Foo i bar, z tą definicją: def go [F] (x: Int): Albo [Awaria F, Sukces F] = ??? – volia17
Zgadzam się, że powinien się skompilować. Nie twierdziłem, że powinno ** nie ** kompilować. Moje pytanie brzmi: jak napisać implementację 'go' (w sposób ogólny), której nie uda się skompilować, jeśli' Bar' nie pojawi się po obu stronach, tj. 'Right' i' Left' lub odwrotnie dla 'right' Foo'. –