2017-10-16 171 views
1

給定一個具有兩個類型參數的函數,是否可以在scala中爲單個類型傳遞類型參數,例如只需提供類型A作爲類型B可以由編譯器從函數fscala中的參數類型推斷

def foo[A, B](f: A => B): B = { 
    f(null.asInstanceOf[A]) 
} 

現在,我發現只有兩種解決方案。

溶液1(標準使用):呼叫foo並指定兩種類型的foo[String, Int](e => 1)Int定義是多餘

解決方案2:該函數的定義更改爲

def foo[A, B](useType: A => Unit)(f: A => B): B = { 
    f(null.asInstanceOf[A]) 
} 

並與使用它

def use[T](t: T) = {} 

val res: Int = foo(use[String]) { a => 1 } 

它的工作,但它似乎不是很漂亮,使用一個函數來提供編譯器的類型。

有沒有什麼辦法可以爲一個函數指定類型爲A的兩個類型參數?

回答

1

通常情況下,類型參數不能在Scala中部分應用。無論是在方法上還是在課堂上。有些包裝可用於:

def myMethod[A, B]() = ??? 

    def myMethod1[A0, W <: Wrapper { type A = A0 }]() = ??? 

    trait Wrapper { 
    type A 
    type B 
    } 

也許有一些路徑依賴類型:

def myMethod1[A0, W <: Wrapper { type A = A0 }](w: W)(): w.B = ??? 

而且在沒有方法,但類有類型lambda表達式和類型成員的辦法的情況下(類型成員可以是部分應用:Wrapper { type A = A0 }對於trait Wrapper { type A; type B }是存在型,如Wrapper[A0, _]對於trait Wrapper[A, B])。

Partially applying type parameters

+0

謝謝您的回答,我會再深入這個方向,看我是否可以使用類,而不是功能。 –