有没有一种方法可以使用foldLeft或任何其他列表方法对scala函数进行排序?

时间:2019-10-18 12:49:20

标签: scala

我正在尝试对功能列表进行排序,这些功能是在同伴对象中定义的:

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"))
}

1 个答案:

答案 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的列表排序为一个组合函数,对于结尾和开头不匹配的情况,唯一的情况是当参数和返回类型都相同时。