我已经开始使用Scala学习FP,其中包含" Scala中的函数编程" (Chiusano& Bjarnason,Manning Publications,2014)
在这个练习中你必须实现一个函数,该函数检查是否根据给定的比较函数对数组进行排序(作者提供的解决方案):
def isSorted[A](as: Array[A], ordering: (A, A) => Boolean): Boolean = {
@annotation.tailrec
def go(n: Int): Boolean =
if (n >= as.length - 1) true
else if (ordering(as(n), as(n + 1))) false
else go(n + 1)
go(0)
}
调用此功能时e。 G。像这样:
isSorted(Array(1, 3, 5, 7), (x: Int, y: Int) => x > y) //evaluates to TRUE
我希望它被评估为 false (不是真的)因为arr没有按降序排序(7,5,3,1)
//Array sorted in descending order ">" as sorting-operator
scala> List(10, 5, 8, 1, 7).sortWith(_ > _)
res2: List[Int] = List(10, 8, 7, 5, 1)
任何人都可以解释这个功能,因为我还没有得到它。非常感谢您的全面解释。
非常感谢你。
答案 0 :(得分:2)
问题在于:
else if (ordering(as(n), as(n + 1))) false
给定谓词x > y
,这将为数组中的每个值产生false
,从而继续传递到else
子句,直到达到n >= as.length - 1
,这将使该方法(错误地)产生真实。
我们可以否定isSorted
内的谓词:
def isSorted[A](as: Array[A], ordering: (A, A) => Boolean): Boolean = {
@annotation.tailrec
def go(n: Int): Boolean =
if (n >= as.length - 1) true
else if (!ordering(as(n), as(n + 1))) false
else go(n + 1)
go(0)
}
然后:
scala> isSorted(Array(1, 3, 5, 7), (x: Int, y: Int) => x > y)
res4: Boolean = false