scala方法调用技巧列表(1,2,3).foldLeft(0)+_

scala方法调用技巧列表(1,2,3).foldLeft(0)+_,scala,Scala,我来自美国,所以我仍然不清楚scala方法调用的语法技巧。我认为lcn在链接中的答案是明确的,但这意味着什么: val r = List(1, 2, 3).foldLeft(0) _+_ //r: String => String = $Lambda$1642/1200068083@562c1af9 val l = r{"hello"} //l: String = $Lambda$1643/1458648440@23ae6386hello 为什么r是一个函数?并调用它返回另一个函数l,并

我来自美国,所以我仍然不清楚scala方法调用的语法技巧。我认为lcn在链接中的答案是明确的,但这意味着什么:

val r = List(1, 2, 3).foldLeft(0) _+_ //r: String => String = $Lambda$1642/1200068083@562c1af9
val l = r{"hello"} //l: String = $Lambda$1643/1458648440@23ae6386hello
  • 为什么
    r
    是一个函数?并调用它返回另一个函数
    l
    ,并且不能调用
    l

  • 是否有()和{}中方法调用的正式文档


  • 这与运算符优先级有关:

    val r = List(1, 2, 3).foldLeft(0) _+_ 
    
    相当于:

    val r = (List(1, 2, 3).foldLeft(0) _) + _
    
    这意味着-我们使用部分应用的
    foldLeft
    函数,
    列表(1,2,3)。foldLeft(0)
    ,它的类型为
    ((Int,Int)=>Int)=>Int)
    ,我们在其上调用
    +

    现在-Scala编译器试图找出
    +
    运算符对函数的含义,并且由于
    函数
    没有定义这样的运算符,因此它尽其所能找到合适的隐式转换,并发现实际上,
    函数
    可以使用其
    toString
    方法转换为
    字符串
    ,因此
    +
    意味着“一个新的匿名函数,它将传递的任何输入字符串附加到
    列表(1,2,3).foldLeft(0)
    函数的字符串表示中”

    因此,我们最终得到了一个
    String=>String
    函数,它将输入附加到函数
    列表(1,2,3)的
    toString
    结果中。foldLeft(0)
    ,即

    scala>val r=List(1,2,3).foldLeft(0)+_
    r:String=>String=
    scala>r(“a”)
    res5:String=a
    scala>r(“bbbb”)
    res6:String=bbbb
    
    这与运算符优先级有关:

    val r = List(1, 2, 3).foldLeft(0) _+_ 
    
    相当于:

    val r = (List(1, 2, 3).foldLeft(0) _) + _
    
    这意味着-我们使用部分应用的
    foldLeft
    函数,
    列表(1,2,3)。foldLeft(0)
    ,它的类型为
    ((Int,Int)=>Int)=>Int)
    ,我们在其上调用
    +

    现在-Scala编译器试图找出
    +
    运算符对函数的含义,并且由于
    函数
    没有定义这样的运算符,因此它尽其所能找到合适的隐式转换,并发现实际上,
    函数
    可以使用其
    toString
    方法转换为
    字符串
    ,因此
    +
    意味着“一个新的匿名函数,它将传递的任何输入字符串附加到
    列表(1,2,3).foldLeft(0)
    函数的字符串表示中”

    因此,我们最终得到了一个
    String=>String
    函数,它将输入附加到函数
    列表(1,2,3)的
    toString
    结果中。foldLeft(0)
    ,即

    scala>val r=List(1,2,3).foldLeft(0)+_
    r:String=>String=
    scala>r(“a”)
    res5:String=a
    scala>r(“bbbb”)
    res6:String=bbbb
    
    这样写完全是一种误导。至少
    .foldLeft(0)\+
    并不表示
    \
    \
    在某种程度上属于同一类。链接的答案没有试图通过删除
    \uu+\uu
    中的所有空格来产生任何视觉错觉。这完全是一种误导性的记录方式。至少
    .foldLeft(0)\+
    并不表示
    \
    \
    在某种程度上属于同一类。链接的答案没有试图通过删除
    \u+\ ucode>中的所有空格来产生任何视觉错觉。一个小错误:隐式转换不是执行到
    String
    ,而是执行到
    scala.runtime.StringAdd
    ,一个只有一个方法
    def+(其他:String)的类
    一个小错误:隐式转换不是执行到
    String
    ,而是执行到
    scala.runtime.StringAdd
    ,该类只有一个方法
    def+(其他:String)