在解决“Scala中的函数编程”中发现的问题时:
实现isSorted,它检查是否根据给定的比较函数对Array [A]进行排序:
def isSorted[A](as: Array[A], ordered: (A,A) => Boolean): Boolean
将我的答案与作者提供的以下解决方案进行比较:
// Exercise 2: Implement a polymorphic function to check whether
// an `Array[A]` is sorted
def isSorted[A](as: Array[A], gt: (A,A) => Boolean): Boolean = {
@annotation.tailrec
def go(n: Int): Boolean =
if (n >= as.length-1) true
else if (gt(as(n), as(n+1))) false
else go(n+1)
go(0)
}
我对以下代码行感到困惑:else if (gt(as(n), as(n+1))) false
我认为在Scala中使用函数作为参数时,需要在当前函数范围之外实际定义一个单独的函数(即,定义另一个函数来执行gt
需要做的事情) ?我没有在其他任何地方看到gt
定义,那么它如何在Boolean
中提供isSorted
值?
我的假设是正确的,还是我完全没有使用函数作为参数?非常感谢详细解释。
答案 0 :(得分:4)
在这种情况下,gt
是作为参数传递给isSorted
的函数;
让我们将它与任何其他参数进行比较,比如a: Int
。我们来看看以下函数:
def increaseByOne(a: Int): Int = a + 1
关于gt
的问题等同于询问:“ increaseByOne
如果a
从未分配值,a
如何使用increaseByOne
?” 。显然,a
方法的调用者必须传递一些值作为gt
的值,但是参数的概念是命名一些提供给它的值。方法
同样适用于isSorted
:它是isSorted
的参数。在您提供的代码中,我们没有看到gt
的来电者,所以我们没有看到isSorted
可能是什么的示例 - 但显然是 gt
的实现不需要假设isSorted
的创建方式和位置,它作为参数传递,因此可以在isSorted(Array(1,3,6), (a: Int, b: Int) => a > b)
中使用。
我们可以设想一个用法如:
(a: Int, b: Int) => a > b
此处,gt
将是JSONObject jObject = new JSONObject(jsonString);
Iterator<String> keys = jObject.keys();
String key;
JSONArray jsonArray;
String value;
while (keys.hasNext()) {
key = keys.next();
countriesList.add(key);
jsonArray = jObject.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++) {
value = jsonArray.getString(i);
citiesList.add(value);
}
countryCities.put(key, citiesList);
citiesList.clear();
的值。