Я изучаю функциональное программирование, следуя книге Пола Кьюзано и Рунара Бьярнасона Функциональное программирование на Scala. Я специально посвящаюсь главе 3, где я реализую некоторые вспомогательные функции для класса, представляющего односвязный список, предоставленный авторами.
package fpinscala.datastructures
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x,xs) => x + sum(xs)
}
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
def tail[A](ls: List[A]): List[A] = ls match {
case Nil => Nil
case Cons(x,xs) => xs
}
... (more functions)
}
Реализуемые мной функции входят в список объектов и являются вспомогательными функциями.
При реализации dropWhile, сигнатура метода которого:
def dropWhile[A](l: List[A])(f: A => Boolean): List[A]
Я столкнулся с некоторыми вопросами относительно применения частичной функции:
В книге авторы говорят, что предикат f передается в отдельной группе аргументов, чтобы помочь компилятору scala с выводом типа, потому что, если мы это сделаем, Scala сможет определить тип f без какой-либо аннотации на основе того, что ему известно. о типе Списка, который делает функцию более удобной в использовании.
Итак, если мы передадим f в той же группе аргументов, scala заставит вызов стать примерно таким: val total = List.dropWhile(example, (x:Int) => 6%x==0 )
где мы явно определяем тип x, и мы «теряем» возможность частичного применения функции, я прав?
Однако почему в этом случае полезно приложение с частичной функцией? Только чтобы разрешить вывод типа? Имеет ли смысл «частично применять» такую функцию, как dropWhile, без применения к ней предиката f? Потому что мне кажется, что вычисление "останавливается", прежде чем станет полезным, если мы не применим f ...
Итак ... чем полезно приложение с частичной функцией? И так ли это всегда, или это только что-то специфическое для Scala? Я знаю, что в Haskell есть что-то, называемое «полным выводом», но я не знаю точно, что это значит ...
заранее спасибо