scala - 在 Scala 中,为什么我不能在不明确指定参数类型的情况下部分应用函数?

标签 scala

这会产生一个匿名函数,正如您所期望的(f 是一个具有三个参数的函数):

f(_, _, _)

我不明白为什么这不能编译,而是给出“缺少参数类型”错误:
f(_, _, 27)

相反,我需要明确指定下划线的类型。考虑到函数 f 的参数类型是什么,Scala 不应该能够推断它们吗?

最佳答案

以下引用文献是 Scala Language Specification

考虑以下方法:

def foo(a: Int, b: Int) = 0

Eta 扩展可以将其转换为 (Int, Int) => Int 类型的值.在以下情况下调用此扩展:

一)_用于代替参数列表(方法值(第 6.7 节))
val f = foo _

b) 参数列表被省略,表达式的预期类型是函数类型(第 6.25.2 节):
val f: (Int, Int) => Int = foo

c) 每个参数都是_ (“匿名函数的占位符语法”(第 6.23 节)的 special case)
val f = foo(_, _)   

表达式,foo(_, 1)不符合 Eta 扩展的条件;它只是扩展到(a) => foo(a, 1) (§6.23)。常规类型推断不会试图找出 a: Int .

关于scala - 在 Scala 中,为什么我不能在不明确指定参数类型的情况下部分应用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2363013/

相关文章:

scala - 幺半群的惯用组合

scala - scala 的图形库

java - 如何使用多个行键从 cassandra 中的计数器列获取值?

scala - 使用 TraversableLike 定义的类型类不适用于 List

scala - Spray.io 路由可以拆分成多个 "Controllers"吗?

scala 链接尝试使用需要 finally/close() 的托管资源

需要 Scala 帮助 - 代码完成

scala - Scala 有像 Java 这样的静态导入吗?

Scala:有问题的类型推断?

在 trait 中定义的 Scala 尾递归流处理器函数保存对流头的引用