为什么scala不能为具有多个参数列表的函数推断公共返回类型?
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] 但作为部分功能:
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)
vsOption(null:String)
。。。几乎总是需要选项
行为(None
)。