Я думаю, то, что вы делаете, можно упростить.
def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
if (as.size < 2)
true
else
as.sliding(2).find(x => !ordered(x(0),x(1))).isEmpty
}
isSorted: [A](as: Array[A], ordered: (A, A) => Boolean)Boolean
scala> isSorted( Array(2), {(a:Int,b:Int) => a < b} )
res42: Boolean = true
scala> isSorted( Array(2,4), {(a:Int,b:Int) => a < b} )
res43: Boolean = true
scala> isSorted( Array(2,4,5), {(a:Int,b:Int) => a < b} )
res44: Boolean = true
scala> isSorted( Array(2,14,5), {(a:Int,b:Int) => a < b} )
res45: Boolean = false
Или, возможно, немного более лаконично (но не обязательно легче для понимания):
def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
if (as.size < 2)
true
else
!as.sliding(2).exists(x => ordered(x(1),x(0)))
}
ОБНОВЛЕНИЕ
Хорошо, я думаю, что у меня есть краткий приз прибит.
def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean =
as.isEmpty || as.init.corresponds(as.tail)(ordered)
person
jwvh
schedule
23.01.2016
break
— это лучшее, что есть в Scala после нарезки хлеба, другие считают, что это зло, поскольку под капотом генерируется исключение. - person Abhijit Sarkar   schedule 23.01.2016reduceLeft
? - person Jus12   schedule 23.01.2016reduceLeft[B >: A](op: (B, T) => B): B
, в моем случае бинарная операция(A, A) => Boolean
- person Abhijit Sarkar   schedule 23.01.2016aggregate(true)((b,x) => b && ordered(x(0),x(1)), (_ && _))
. - person jwvh   schedule 23.01.2016