假设我有一个特质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]'? –