繁体   English   中英

&&如何在左折标架中工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM