Есть ли способ упорядочить функцию scala, используя foldLeft или любой другой метод списка? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь упорядочить список функций, эти функции определены в сопутствующем объекте:

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 Ответ

1 голос
/ 18 октября 2019

Вы можете сделать это только в том случае, если все функции имеют одинаковый тип.

  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в одну составную функцию, так как конец и начало не совпадают, единственный случай, когда они совпадают, когда аргумент и тип возвращаемого значения совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...