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)
答案 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。