2017-03-05 56 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