2017-04-05 64 views
1

我該如何完成這項工作?我手頭的任務是有點複雜,但它歸結爲:多態函數中的Scala自動類型推斷

object Z { 
    class B extends Function1[Int, Int] { 
    def apply(i: Int): Int = i 
    } 

    def compose[T <: Function1[X, X], X](fcts: List[T]): Function1[X, X] = { 
    fcts.reduce(_ andThen _) 
    } 

    def test() = { 
    val fcts = List.empty[B] 

    // Unspecified type parameter X 
    val composed: Function1[Int, Int] = compose[B](fcts) 
    } 
} 

我不知道如何界定「撰寫」功能,能夠接收一些具體的B類和自動推斷依賴類型X

回答

2

Scala編譯器在嘗試推斷像您一樣的多個類型參數級別時表現不佳。相反,刪除T <: Function1[X, X]會更簡單,只需要一個表示Function1的參數和返回類型的類型參數。

def compose[A](fcts: List[Function1[A, A]]): Function1[A, A] = { 
    fcts.reduce(_ andThen _) 
} 

編譯器將有一個更容易的時間簡單地推斷A,而不是試圖找出與TX是,當XT類型的一部分。

val a: Int => Int = _ + 10 
val b: Int => Int = _ * 2 
val c: Int => Int = _ - 3 

scala> val f = compose(List(a, b, c)) 
f: Int => Int = scala.Function1$$Lambda$1187/[email protected] 

scala> f(2) 
res1: Int = 21 

請注意,reduce將拋出一個空函數的例外。

+0

確定它是一個解決方案..不完全是我會喜歡,雖然..沒有其他選擇使用forSome或其他Scala技巧?事情是,我的作品並不完全收到一個List [B](或Function1的列表)..)它比這更復雜一點。 –

+0

@MichelLemay您可能可以在不同的情況下做一些不同的事情,但在這種情況下,我沒有看到類型推斷的不足。 –