Scala 的函数文字中 => (向右双箭头)运算符的链接是什么意思?

What is the meaning of the chaining of => (rightward double arrow) operator in Scala's function literal?

在这段代码中 => 运算符的链接是什么意思:

val a = Array("I", "love", "Scala Johnson")
a.foreach {
    x => y: String => println(x)
}

它什么也没打印出来。

所以发生了什么事? x 是否在编译中丢失?

如果我从 y 参数中删除了 String 类型声明:

x => y => println(x)

我遇到 "missing parameter type" 编译错误。

然后我做了一个实验:

val hotFunc: Int => Int => Unit = x => y => println(x * y)
hotFunc(2)(11)

打印出来22

那么,=> 的链接是否意味着柯里化?

更新:

第3种情况:

def readFile[T](f: File)(handler: FileInputStream => T): T = {
    val resource = new java.io.FileInputStream(f)
    try {
        handler(resource)
    } finally {
        resource.close()
    }
}

val bs = new Array[Byte](4)

readFile(new File("Slurp.scala")) {
    input => b: Byte => println("Read: " + (input.read(bs) + b))
}

和第一个例子一样,没有打印出来。

=> 是右结合的,因此在您的第一个示例中,您调用的函数的值为 a,其中 return 是一个函数 String=>Unit(但是永远不会被捕获,因为 foreach 而被隐式转换为 Unit)。可能用括号会更清楚:

x => ((y: String) => println(x))

变成了

x => ((y: String) => println(x); ())

foreach 中,因为它期望 T => Unit.

=> 的链接(不带括号)有点柯里化,是的。