2016-08-02 93 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 
    }