gpt4 book ai didi

scala - Scala 2.10 中的 Option.fold

转载 作者:行者123 更新时间:2023-12-04 22:06:29 25 4
gpt4 key购买 nike

在与 scala 2.10.0-M7 的以下 session 中:

scala> trait A
defined trait A
scala> class B extends A
defined class B
scala> class C extends A
defined class C
scala> Some(0).fold(new B){_=>new C}
<console>:11: error: type mismatch;
found : C
required: B
Some(0).fold(new B){_=>new C}

我希望编译器找到共同的父类(super class)型(即 A)而不是提示。它是一般类型推断限制,还是 Option.fold 定义方式的结果?

谢谢你。

最佳答案

Scalas类型推理算法的组合问题结果和方式Option.fold被定义为。

Scalas 类型推断从左到右工作,这意味着它从最左边的符号开始搜索表达式的可能类型。此外,对于方法参数列表,这意味着泛型类型绑定(bind)到由最左侧参数列表填充的类型:

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 answer例如。

见讨论 here完整解释为什么它被定义为它的定义。简而言之: Option在很多方面都遵循集合的设计 - 因此,当它的行为方式与集合相同时会更清楚。

关于scala - Scala 2.10 中的 Option.fold,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12321164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com