2016-03-03 63 views
2

考慮下面的代碼:(見下文,需要解決的實際代碼)與函數類型Scala的類型推斷

def applyAll[T,S, U <: Seq[T => S]](l : U, x: T) = l.map(f => f(x)) 
val u = List((i: Int) => i + 1, (i: Int) => i + 2) 
println(applyAll(u,1)) 

(給出的T => S一個Seq和價值,我們期望得到funtions應用於此值)。

雖然applyAll編譯罰款,稱這是對u提供了以下錯誤:

Error:(35, 13) inferred type arguments [Int,Nothing,List[Int => Int]] do not conform to method applyAll's type parameter bounds [T,S,U <: Seq[T => S]] 
println(applyAll(u,1)) 
     ^

這表明編譯器無法推斷出類型參數S,我猜是因爲它是「套'在函數類型T => S內。


編輯:

我試圖解決實際的代碼相似(雖然複雜),並不能除去在U參數是固定的。在這裏:

def applyNatural[T, S, Repr <: TraversableLike[T => S, Repr], That] 
(data: T, jobs: Repr) 
(implicit bf: CanBuildFrom[Repr, S, That]): That = { 
    jobs.map(f => f(data)) 
} 
val u = List((i: Int) => i + 1, (i: Int) => i + 2) 
val v = applyNatural(1, u) 
println(v) 
+0

我看到兩個問題編輯代碼:首先,再版是循環。要解決Repr,你必須查找Repr。其次,沒有建立。 –

+0

你究竟想要做什麼? –

+0

我正在創建一個函數,它可以將一個函數集合應用到一個值,並返回一個相同類型的值的集合。 –

回答

3

您可以Repr更高kinded型,使jobs參數有型Repr[T => S]

def applyNatural[T, S, Repr[A] <: TraversableLike[A, Repr[A]], That] 
    (data: T, jobs: Repr[T => S]) 
    (implicit bf: CanBuildFrom[Repr[T => S], S, That] 
): That = { 
    jobs.map(f => f(data)) 
} 
+0

這很有效!我還用def applyNatural [T,S,U <:Traversable [T => S],That](data:T,jobs:Traversable [T => S,U])來管理(隱式bf:CanBuildFrom [U,S , 那個那個 ;但你的解決方案更好 –

4

U是根本沒用的。只要寫

def applyAll[T,S](l : Seq[T => S], x: T) = l.map(f => f(x)) 
    val u = List((i: Int) => i + 1, (i: Int) => i + 2) 
    println(applyAll(u,1)) 
+0

謝謝,它適用於給定的代碼,雖然它不能解決我實際試圖解決的問題(我簡化了一下) - 我用我的實際問題更新了問題 –