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
.
=>
的链接(不带括号)有点柯里化,是的。
在这段代码中 =>
运算符的链接是什么意思:
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
.
=>
的链接(不带括号)有点柯里化,是的。