在线应用部分应用函数的问题

时间:2013-10-03 20:42:40

标签: scala

在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>

有什么想法吗?

1 个答案:

答案 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 => CharInt函数的第二个参数,f是结果字符串中的字符

在第二种情况下,你有:

Char

通过括号你将它分成几个东西,第一个是函数scala> (f(1, _:Int))(2) res: String = 1 2 Int => String调用这个函数,你将一个参数(2)传递给这个函数{{1 }}:

2