Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么scala不能为具有多个参数列表的函数推断公共返回类型?_Scala - Fatal编程技术网

为什么scala不能为具有多个参数列表的函数推断公共返回类型?

为什么scala不能为具有多个参数列表的函数推断公共返回类型?,scala,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] 但作为部分功能:

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)

使用选项而不是某些选项:

val x = handleUndefined2(Option(1))(None)
或者,您可以强制“某些”选项:

val x = handleUndefined2(Some(1): Option[Int])(None)
通常,出于这个原因,最好总是使用选项而不是某些选项。

首先,它不是一个“部分函数”,您所做的被称为“curried函数”

第二,尝试以下方法:

val x = handleUndefined1(Some(1), _)
看看会发生什么。您将收到一条警告,指出第二个参数缺少类型参数。为什么?


类型推断器从左到右。一般来说,第一个参数组中的类型将决定第二个、第三个等参数组中的类型。如果您遗漏了类型参数,推理器将无法确定它应该成为的类型,因为您遗漏了信息。

我不知道您的一般建议(从某种意义上说,我喜欢最有意义的特定类型),但是你用folds的签名打了这个,中性元素或零元素必须有正确的类型。
handleUndefined2[Option[Int]](Some(1))(None)
是另一个选项。@som snytt我想奥德斯基在FP Scala Coursera课程中提到了这个建议,但可能是其他人…另一个常见的问题是用
def=Some(A)
覆盖
def:Option[A]
,因为这缩小了f的推断类型(现在被认为是一个bug,并且会改变)。这个规则你可能是对的。@som snytt啊,现在我记得了,另一个区别是
Some(null:String)
vs
Option(null:String)
。。。几乎总是需要
选项
行为(
None
)。