【问题标题】:Why does partial application require to specify a parameter type?为什么部分应用需要指定参数类型?
【发布时间】:2016-02-10 19:23:24
【问题描述】:

为什么 Scala 中的偏函数应用程序需要提供类型,例如:

def func(a: Int, b: Int) = ???

def func1 = func(_ : Int, 1) // compiles fine

def func1x = func(_, 1) // does not compile
// error: missing parameter type for expanded function ((x$2) => func(x$2, 1))

为什么在这种情况下不推断类型?推断类型会导致语法复杂或模棱两可,还是类型可能不像我认为的那样清晰?

【问题讨论】:

  • 仅供参考,您只需为顶级定义提供类型注释即可轻松避免此类情况。无论如何,这对于文档目的是有好处的。
  • @Cubic 恐怕我不明白。你能举个例子吗?在这种情况下会是什么样子?

标签: scala type-inference partial-application


【解决方案1】:

从编译错误可以看到func(_, 1) 扩展为x => func(x, 1)。如果您首先写了def f = x => func(x, 1),则不能保证xInt。不幸的是,SLS 6.23.1 在没有明确给出类型归属时没有提及填写类型归属。

List(1, 2, 3).map(_ + 1) 有效,因为map 需要Int => Int 的参数。 def func1x = func(_, 1) 不起作用,因为 func1x 的类型是从右侧推断出来的,但在技术上也不知道。仅推断x: Int => f(x, 1) 才有意义,但我猜这会增加编译器的另一个不必要的复杂性,必须处理方法参数上占位符语法的极端情况。

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多