假設我有一個特質Foo[A, B]
。是否有可能將類型參數的類型參數傳播到Scala中的參數化類?
我想定義一個類Bar
,使用Foo
進行參數化並在Bar
方法中重用Foo
類型參數。喜歡的東西如下所示(此片段不編譯):
trait Bar[Foo[A, B]] {
def doSmth[C](A => C): C
}
有什麼辦法來實現類似的東西,還有剛剛在Bar
聲明單一類型的參數?
p.s.如果有人能夠爲所描述的東西提供正確的術語,這也會很棒。
假設我有一個特質Foo[A, B]
。是否有可能將類型參數的類型參數傳播到Scala中的參數化類?
我想定義一個類Bar
,使用Foo
進行參數化並在Bar
方法中重用Foo
類型參數。喜歡的東西如下所示(此片段不編譯):
trait Bar[Foo[A, B]] {
def doSmth[C](A => C): C
}
有什麼辦法來實現類似的東西,還有剛剛在Bar
聲明單一類型的參數?
p.s.如果有人能夠爲所描述的東西提供正確的術語,這也會很棒。
不確定,但也許這是你想去的地方。
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
}
這意味着,當你在一個混合一Bar
Foo
是必需的。
您可以使用#運算符來訪問類或特徵的類型成員。
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
}
如果'Foo'是一個特徵,將它包含在類型參數中的目的是什麼?什麼是用例? –
@ m-z:我試圖做一個基於Bar的計算鏈(雖然我不確定它是否可以稱爲Monad)。 'Foo [A,B]'表示當前的計算步驟,它可以像'Function1'一樣運行。我真的很喜歡'Bar'部分在其類型中攜帶一些計算上下文。 – Roman
你需要知道'Bar'中的'Foo'嗎?還是隻有類型參數?也就是說,如果你確實有多個類型參數,它會是'Bar [A,B]'還是'Foo [A,B,F [A,B]'? –