【发布时间】:2016-08-22 07:51:32
【问题描述】:
我正在学习函数式编程,学习的是 Paul Chiusano 和 Rúnar Bjarnason 所著的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 的类型,基于它知道 List 的类型,这使得函数更方便使用。
所以,如果我们在同一个参数组中传递 f,scala 将强制调用变成这样:val total = List.dropWhile(example, (x:Int) => 6%x==0 ),我们显式定义 x 的类型,我们将“失去”部分函数应用的可能性,我说的对吗?
但是,为什么偏函数应用在这种情况下很有用?只允许类型推断?在不应用谓词 f 的情况下“部分应用”像 dropWhile 这样的函数是否有意义?因为在我看来,如果我们不应用 f...,计算会在有用之前“停止”...
那么...为什么偏函数应用程序有用?这是它总是如何完成的,还是它只是 Scala 特有的东西?我知道 Haskell 有一种叫做“完全推理”的东西,但我不知道它的确切含义......
提前致谢
【问题讨论】:
标签: scala functional-programming partialfunction