在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)时(临时)将f(1, _:Int)
视为字符串(与其实际类型:Int => String
)。
如果使用括号,我预计会发生什么:
scala> (f(1, _:Int))(2)
res: String = 1 2
但是,这似乎不是操作顺序问题,因为我找不到添加括号来实现意外行为的方法(即,结果是类型Int => Char
)。 / p>
有什么想法吗?
答案 0 :(得分:2)
首先关于结果类型:
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)
时,您将其部分应用于参数one并返回类型为Int => String
的函数,其中{{1}是第二个参数。然后你的参数Int
调用函数(2)
的结果字符串上的apply
方法,它返回Int => String
,从这里得到类型为Char
的函数,其中Int => Char
是Int
函数的第二个参数,f
是结果字符串中的字符
在第二种情况下,你有:
Char
通过括号你将它分成几个东西,第一个是函数scala> (f(1, _:Int))(2)
res: String = 1 2
而Int => String
调用这个函数,你将一个参数(2)
传递给这个函数{{1 }}:
2