我是Scala的新手,正在阅读有关Scala中部分应用的函数的信息。我有一个通用功能“ wrap”,可以连接三个字符串。
Use Batch to run large-scale parallel and high-performance computing (HPC) applications efficiently in the cloud.
当我尝试做这样的专门功能
def wrap(prefix: String)(html: String)(suffix: String) = prefix + html + suffix
它因缺少参数类型错误而失败,但是如果我为第一个参数提供类型,则可以使用
val foo = wrap(_)("Hello")(_)
我的问题是:
为什么必须冗余提供类型?我已经在wrap的一般定义中提供了它。
为什么最后一个参数不需要类型?
答案 0 :(得分:2)
正如您所发现的,您需要先向编译器提供有关类型的更多信息,然后才能确定foo
的类型。您可以指定参数类型:
val foo = wrap(_: String)("Hello")(_: String)
或结果类型
val foo: (String, String) => String = wrap(_)("Hello")(_)
使用2.12.7
val foo = wrap(_: String)("Hello")(_) // Does not compile
答案 1 :(得分:2)
Scala编译器不能总是推断类型,例如:考虑重载方法,在这种情况下,编译器不可能知道您要引用的类型。
def wrap(prefix: String)(html: String)(suffix: String) = prefix + html + suffix
def wrap(prefix: Int)(html: String)(suffix: String) = prefix.toString + html + suffix
val foo = wrap(_: String)("Hello")(_: String)
val foo1 = wrap(_)("Hello")(_) // compilation Error: Cannot resolve method 'wrap'
因此,您需要像下面那样显式指定类型参数:
val foo = wrap(_: String)("Hello")(_: String)
val foo1 = wrap(_: Int)("Hello")(_: String)
或明确指定返回类型:
val foo: (String, String) => String = wrap(_)("Hello")(_)
val foo1: (Int, String) => String = wrap(_)("Hello")(_)