我正在尝试对功能列表进行排序,这些功能是在同伴对象中定义的:
object solution {
def methodA(l: List[String]): List[Int] = {
l.map(_.toInt)
}
def methodB(l: List[Int]): List[Int] = {
l.map(_ + 1)
}
def methodC(l: List[Int]): Long = {
l.sum
}
def main(args: Array[String]): Unit = {
val f1 = this.methodA _
val f2 = this.methodB _
val f3 = this.methodC _
val fs = f1 andThen f2 andThen f3
fs.apply(List("1", "2", "3"))
}
}
我想要的是这种风格:
def main(args: Array[String]): Unit = {
val fs = List(f1, f2, f3)
fs.foldLeft(someFunc).apply(List("1", "2", "3"))
}
答案 0 :(得分:1)
仅当所有函数具有相同的类型时,才可以这样做。
type A = String
type B = String
type C = String
type D = String
val f1: A => B = identity
val f2: B => C = identity
val f3: C => D = identity
val ls: List[String => String] = List(f1, f2, f3)
val aggregate: String => String = ls.reduceLeft(_ andThen _)
aggregate.apply(...)
这是因为Scala编译器会将列表的类型推断为列表中所有值的超类型,对于单参数函数而言,该类型为Nothing => Any
,现在您无法将Nothing => Any
的列表排序为一个组合函数,对于结尾和开头不匹配的情况,唯一的情况是当参数和返回类型都相同时。