2017-03-05 53 views
1

说我有一个类,需要一个更高的kinded类型,我想写的东西是这样的:提取和使用更高kinded类型中的类型参数?

class Foo[T[U]](thing: T[U]) { 
    def someMethodThatUsesU(arg: U): U = ??? 
} 

这无法编译,因为编译器无法识别该符号U。怎么来的?有没有另一种方式来写这个没有做像class Foo[U, T[U]]

一些背景:这是一个简化的问题示例。最后,我想写出这样的事情:如果你关心什么U

trait SomeTrait[T] 

class SomeClass[T[U] <: SomeTrait[U]](arg: T[U]) { 
    def somethingWithU(arg: U): U = ??? 
} 

回答

0

我想通了,我的用例工作的很好的解决方案。简单地将该类型分配给类型成员并使用类型投影:

​​
3

T[U]是不是一个真正的,kinded较高的类型。这只是一个普通的老式。如果你的类或方法是由某种类型的构造函数单独参数化的,则更高类型的类型是,例如, OptionList

class[T[U]](...)无法编译,因为您试图使用两个类型参数,但只声明T。没有办法以这种方式声明两个类型参数。你已经被宣告T是唯一的好选择更高kinded,与独立变化的第二个类型参数U

class Foo[T[_], U](thing: T[U]) { 
    def someMethodThatUsesU(arg: U): U = ??? 
} 
+0

嗯,谢谢你澄清什么更高级的类型。是的,这将工作,虽然它基本上是我最初试图避免:( – bioball