【发布时间】:2015-08-17 06:53:41
【问题描述】:
我正在通过练习“不耐烦的 Scala”一书中的练习来学习 Scala。有几个问题可以测试柯里化的概念。我已尽我所能回答了这些问题,但我想由这里的专家来运行这些问题。
调用
corresponds来检查 字符串数组的长度在整数数组中给出。
我的代码:
def isCorrespondingLength(arr: Array[String], len: Array[Int]) = {
arr.corresponds(len)(_.length == _)
}
在不使用柯里化的情况下实现
corresponds。然后尝试从 以前的练习。你遇到了什么问题?
Ans:编译器不能像上一个练习那样使用下划线派生类型。
def myCorresponds(arr: Array[String], that: Seq[Int], f: (String, Int) => Boolean) = {
arr.zip(that).find(p => f.apply(p._1, p._2)).isDefined
}
实现一个类似于
if的unless控制抽象, 但有一个倒置的条件。第一个参数是否需要是 按名称调用参数?你需要咖喱吗?
Ans:第一个参数不需要是按名称调用的参数。由于它只评估一次,因此评估是在调用站点(如按值调用)还是在函数内部(按名称调用)发生都不会影响结果。柯里化,如unless2,提供了一个很好的控制抽象unless2(false) { block },但这不是必需的。
def unless(condition: () => Boolean, block: => Boolean): Boolean = {
if (!condition()) block else false
}
def unless2(condition: => Boolean)(block: => Boolean): Boolean = {
if (!condition) block else false
}
【问题讨论】:
标签: function scala closures currying higher-order-functions