创建部分应用的功能时缺少扩展功能的参数类型

时间:2019-01-03 07:17:04

标签: scala functional-programming curry

我是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")(_)

我的问题是:

  1. 为什么必须冗余提供类型?我已经在wrap的一般定义中提供了它。

  2. 为什么最后一个参数不需要类型?

2 个答案:

答案 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")(_)