我想以編程方式編寫幾個函數。如果這些功能都是同一類型的,我可以做到以下幾點:用不同類型的函數減少和然後
def a(x: Int): Int = x+1
def b(y: Int): Int = y/2
def c(z: Int): Int = z*4
val f1 = (a _) andThen (b _) andThen (c _)
val f2 = List((a _), (b _), (c _)).reduce(_ andThen _)
在這一點f1
和f2
都是一樣的東西,這編譯因爲定義f2
的List
是List[Function1[Int,Int]]
但是,如果我想使用相同的基本縮減技術將不同類型的多個兼容功能鏈接在一起,則會發生錯誤。
def d(x: Double): Int = x.toInt
def e(y: Int): String = y.toString
def f(z: String): Double = z.toDouble*4
//Works fine
val f3 = (d _) andThen (e _) andThen (f _)
//Doesn't compile
val f4 = List((d _), (e _), (f _)).reduce(_ andThen _)
第二個選項不編譯,因爲它定義f4
名單推斷爲List[Function1[Any,Any]]
,但我想不通,如果那裏有一個乾淨的類型安全的方式,採取的職能的有序集合形成Function1[A,B],Function1[B,C],Function1[C,D],...,Function1[X,Y]
並將它們粘合在一起,形成Function1[A,Y]
。
任何想法?
我不相信'和Then'可以確信它在列表中的正確位置。爲了更清楚地說明,在'f3'表達式中考慮兩個'和'運算符:第一個'和Then'與第二個'和Then'是不同的操作,因爲它使用不同的函子作爲它的參數。由於推理鏈的關係,鏈只能真正起作用。 List()結構完全繞過了所有這些。 –
我認爲這可以用不成形的''HList'來完成。當我有時間時,我會盡力去玩。 – ghik