作为 Scala 的新手,我在 sbt 控制台上玩弄了部分应用的函数语法。我遇到了一个非常奇怪的问题,我不理解 Scala 的行为。
这个例子是人为设计的,在现实中不太可能遇到。就是说,就在这里。假设我定义了以下函数:
scala> def f(x: Int, y: Int) = "%d %d".format(x, y)
现在如果我输入
scala> f(1, _:Int)(2)
res: Int => Char = <function1>
结果是一个Int => Char
函数,这很不寻常。换句话说,Scala 在应用参数(即 2)。
相反,如果使用括号,我期望发生的事情会发生:
scala> (f(1, _:Int))(2)
res: String = 1 2
但是,这似乎不是操作顺序问题,因为我找不到添加括号来实现意外行为的方法(即,结果类型为 Int => Char
)。
有什么想法吗?
最佳答案
首先关于结果类型:
scala> f(1, _:Int)(2)
res: Int => Char = <function1>
检查一下:
scala> val str = "hello"
str: String = hello
scala> str(2)
res12: Char = l
我认为这很清楚。
函数本身没有,因为它也很简单。当您将它提升为带有下划线的函数时,您不仅提升了 f
,而且还提升了对字符串(第一个结果)的调用 (2)
,这是为什么你得到:
res: Int => Char = <function1>
已添加
更明确的版本。你的函数 f
是 (Int, Int) => String
类型,当你写 f(1, _: Int)
时,你是将它部分应用于第一个参数并返回类型为 Int => String
的函数,其中 Int
是第二个参数。然后你的参数 (2)
在函数 Int => String
的结果字符串上调用 apply
方法,它返回一个 Char
,从这里你得到 Int => Char
类型的函数,其中 Int
是你的 f
函数和 的第二个参数>Char
是结果字符串中的一个字符
在第二种情况下,您有:
scala> (f(1, _:Int))(2)
res: String = 1 2
通过括号,您将其拆分为多个东西,第一个是函数 Int => String
并且 (2)
调用此函数,您正在传递一个参数2
到这个函数 Int => String
:
val ff = f(1, _: Int)
val res = ff(2)
关于scala - 在线应用部分应用函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19168881/