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

标签 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)。

相反,如果使用括号,我期望发生的事情会发生:

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/

相关文章:

具有 Future 返回类型的 Scala 递归函数

arrays - Scala:如何按元组的第二个元素对元组数组进行排序?

scala - Akka DistributedPubSubMediator at-least-once delivery guarantees for publishing to a topic

scala - 将 Spark 数据帧插入 hbase

java - 如何以编程方式在 Gradle 中添加传递依赖项?

java - 匿名对象的 Scala 语法

java - Spark 流: class cast exception for SerializedOffset

scala - 增加 Scala 的 JVM 堆大小?

scala - 在scala Spark中将文件读入数组列表

scala - SBT依赖树