[英]How does the && work in a foldleft scala
因此,我正在阅读“ Scala中的功能编程”,并且正在做练习2.2
实现isSorted,它检查Array [A]是否根据给定的比较函数进行排序:def isSorted [A](如:Array [A],有序:(A,A)=> Boolean):Boolean = {
我的解决方案,有效
{
def orderByValue(a : Int, b : Int): Boolean ={
println (a + " " + b )
if( a<= b) true
else false
}
//exercise, def to check wheter an Array[a] is sorted
def isSorted[A] (as: Array[A], ordered: (A,A) => Boolean) : Boolean = {
var result = true;
def loop(n: Int) {
if (result == false)
false //Return false on first instance
else if (n < as.length -1) {
result = ordered(as(n), as(n + 1))
loop(n + 1)
}
else
result
}
loop(0)
result
}
}
我为第一次尝试感到很自豪,但认为它看起来功能不强,所以我问了一个朋友,他回来了。
{
def isSorted2[A] (as: Array[A], ordered: (A,A) => Boolean) : Boolean = {
as.sliding(2,1).foldLeft(true)((res, a ) => ordered(a(0), a(1)) && res)
}
}
像wtf一样,这种黑魔法怎么可能。 我从as.sliding(2,1).foldLeft(true)((res,a)=> ordered(a(0),a(1))了解所有内容,但是&&分开了,我看不到找到我知道它折叠了上一个操作的结果,但是它是如何工作的,这个操作叫什么。
def isSorted2[A] (as: Array[A], ordered: (A,A) => Boolean) : Boolean = {
as.sliding(2,1).foldLeft(true)((res, a ) => ordered(a(0), a(1)) && res)
}
&&
是此处的常规逻辑运算符。 有序函数的签名为(A,A) => Boolean
,这意味着它接受类型A的两个参数,并且为true时,布尔值指示参数1是大于还是小于参数2。 res是foldLeft函数的累加器,即使其中一项没有正确的排序顺序,该函数也设置为false。 这是通过第二个咖喱参数(res, a ) => ordered(a(0), a(1)) && res
来确保的
因此,这里的简单逻辑是,如果对列表中的当前相邻项目进行排序,并且对列表中的所有先前项目也进行了排序,则对列表进行排序,直到当前位置为止。 因此,如果我们将当前位置移到列表的末尾,并且列表仍在排序,则整个列表都会被排序。 但是,即使一个项目与其相邻邻居相比的排序顺序不同,acc仍将设置为false,并且整个方法的输出将为false。
foldLeft方法的API定义在此处可用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.