为什么scala无法推断具有多个参数列表的函数的常见返回类型?

时间:2016-07-12 17:35:11

标签: scala

Scala可以将两个参数的公共基数推断为函数,T = Option[Int]来自Some[Int]None

  def handleUndefined1[T](op: => T, alt: => T) : T = {
    try { op }
    catch { case _: Exception => alt }
  }

  val x = handleUndefined1(Some(1),None)  // Option[Int]

但作为部分功能:

  def handleUndefined2[T](op: => T)(alt: => T) : T = {
    try { op }
    catch { case _: Exception => alt }
  }

  // None is not Some[Int]      
  val x = handleUndefined2(Some(1))(None)

2 个答案:

答案 0 :(得分:3)

首先,它不是"部分功能"你正在做的事情被称为" curried功能。"

其次,请尝试以下方法:

val x = handleUndefined1(Some(1), _)

看看会发生什么。您会收到警告,说明您在第二个参数上缺少类型参数。为什么呢?

类型推理器从左到右。通常,第一个参数组中的类型将确定第二个,第三个参数组中的类型等。如果省略类型参数,推理器将无法确定它应该变成的类型,因为您已经遗漏了信息。

答案 1 :(得分:2)

使用选项而不是某些:

val x = handleUndefined2(Option(1))(None)

或者你可以强迫Some to Option:

val x = handleUndefined2(Some(1): Option[Int])(None)

一般来说,出于这个原因,总是使用Option而不是Some。