scala中的FP排序功能解释

时间:2017-10-05 07:01:23

标签: arrays scala sorting functional-programming

我已经开始使用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)

任何人都可以解释这个功能,因为我还没有得到它。非常感谢您的全面解释。

非常感谢你。

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