2016-08-02 92 views
4

假設我有一個特質Foo[A, B]是否有可能將類型參數的類型參數傳播到Scala中的參數化類?

我想定義一個類Bar,使用Foo進行參數化並在Bar方法中重用Foo類型參數。喜歡的東西如下所示(此片段不編譯):

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

有什麼辦法來實現類似的東西,還有剛剛在Bar聲明單一類型的參數?

p.s.如果有人能夠爲所描述的東西提供正確的術語,這也會很棒。

+0

如果'Foo'是一個特徵,將它包含在類型參數中的目的是什麼?什麼是用例? –

+0

@ m-z:我試圖做一個基於Bar的計算鏈(雖然我不確定它是否可以稱爲Monad)。 'Foo [A,B]'表示當前的計算步驟,它可以像'Function1'一樣運行。我真的很喜歡'Bar'部分在其類型中攜帶一些計算上下文。 – Roman

+0

你需要知道'Bar'中的'Foo'嗎?還是隻有類型參數?也就是說,如果你確實有多個類型參數,它會是'Bar [A,B]'還是'Foo [A,B,F [A,B]'? –

回答

1

不確定,但也許這是你想去的地方。

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

或者,使用類型別名。

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

這意味着,當你在一個混合一BarFoo是必需的。

1

您可以使用#運算符來訪問類或特徵的類型成員。

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 
    }