Scalas 类型推理算法和方式如何Option.fold
定义的结合的问题结果。
Scalas 类型推断从左到右工作,这意味着它从最左边的符号开始搜索表达式的可能类型。此外,对于方法参数列表,这意味着泛型类型绑定到由最左侧参数列表填充的类型:
scala> def meth[A](a1: A, a2: A) = (a1, a2)
meth: [A](a1: A, a2: A)(A, A)
scala> meth(1, "")
res7: (Any, Any) = (1,"")
scala> def meth[A](a1: A)(a2: A) = (a1, a2)
meth: [A](a1: A)(a2: A)(A, A)
scala> meth(1)("")
<console>:10: error: type mismatch;
found : String("")
required: Int
meth(1)("")
^
可以看出,在第一种情况下Any
是推断出来的,而在第二种情况下,会抛出编译器错误,因为类型A
受第一个参数列表的约束,而第二个不能再更改它。
但是为了使问题中的方法调用正常工作,Option
可能直到到达第二个参数列表时才定义结果的类型。因为这需要从右到左的类型推断,因此会出现错误。这有点等同于List.fold
:
scala> List(1).foldLeft(Nil)((xs,x) => x::xs)
<console>:8: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1).foldLeft(Nil)((xs,x) => x::xs)
^
要使代码正常工作,必须明确指定结果集合的类型,请参阅@rks 答案以获取示例。
请参阅此处的讨论以获取完整解释为什么它被定义为定义。简而言之:Option
在很多方面都遵循集合的设计——因此当它的行为方式与集合相同时会更清楚。