2016-08-02 13 views
4

Angenommen, ich habe eine Eigenschaft .Ist es möglich, einen Typparameter eines Typparameters auf eine parametrisierte Klasse in Scala zu übertragen?

Ich möchte Bar eine Klasse definieren, parametrisiert mit Foo und Foo Typparametern in Bar Methoden wiederverwenden. So etwas wie unten gezeigt (dieser Schnipsel nicht kompiliert):

trait Bar[Foo[A, B]] { 
    def doSmth[C](A => C): C 
} 

Gibt es eine Möglichkeit, etwas zu erreichen ähnlich und hat nach wie vor nur einen einzigen Typen Parameter in Bar Erklärung?

p.s. es wäre auch großartig, wenn jemand die richtige Terminologie für das beschriebene Zeug vorschlagen könnte.

+0

Wenn 'Foo' ein Merkmal ist, was ist der Zweck, es in die Typargumente aufzunehmen? Was ist der Anwendungsfall? –

+0

@ m-z: Ich versuche eine Rechenkette basierend auf 'Bar' zu erstellen (ich bin mir nicht sicher, ob man sie auch als' Monad' bezeichnen kann). 'Foo [A, B]' steht für den aktuellen Berechnungsschritt und kann wie 'Function1' aussehen. Ich würde wirklich gerne den 'Bar'-Teil haben, um einige Berechnungskontext in seinem Typ zu tragen. – Roman

+0

Würdest du über 'Foo' in' Bar' wissen müssen? Oder nur die Typparameter? Das heißt, wenn Sie mehrere Typparameter hätten, wäre es "Bar [A, B]" oder "Foo [A, B, F [A, B]"? –

Antwort

1

Nicht sicher, aber vielleicht ist dies irgendwo in der Nähe, wo Sie hin wollen.

trait Foo[A,B] 
trait Bar[A] { self: Foo[A,_] => 
    def doSmth[C](atoc: A => C): C 
} 

Oder mit einem Typ-Alias.

trait Foo[A,B] {type FooA = A} 
trait Bar { self: Foo[_,_] => 
    def doSmth[C](atoc: FooA => C): C 
} 

Dies bedeutet, dass ein Foo erforderlich, wenn Sie einen Bar in der Mischung haben.

1

Sie können den Operator # verwenden, um auf Typenmitglieder der Klasse oder Merkmale zuzugreifen.

trait M { 
    type A 
    type B 
    } 

    class F[X,Y] extends M { 
    type A = X 
    type B = Y 
    } 

    trait Bar[F] { 
    def doSmth[C](x: M#A => M#B): C 
    } 
Verwandte Themen