gpt4 book ai didi

scala - Dotty 如何决定如何推断/何时扩大联合类型?

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

已经讨论了扩大联合类型 here但我似乎无法找到以下案例的答案
让我们从以下内容开始

val x = List(1, 2, "a")
这个异构列表被推断为 List[Any]就像在 Scala 2 中一样
然而以下
val x2 = List(List(1, 2), Vector("a", "b"))
推断为 List[scala.collection.immutable.AbstractSeq[Int | String]]这是相当困惑的行为。为什么两种不相交类型的 LUB 被推断为 Any在一种情况下,但在另一种情况下是联合类型?
如果这只是一个设计决定,是否有任何此类情况需要人们注意?

最佳答案

smarter状态

we avoid inferring union types for the same reason we avoid inferringsingleton types, because sometimes they're "too precise"


我对这句话的解释是输入 List(1,2) 更有意义。如 List[Int]而不是 List[1 | 2] , 或 List(new Cat, new Dog)List[Animal]而不是 List[Cat | Dog] .
另请参阅相关 question 中 Dmytro 的评论(我的)

Quote from guillaume.martres.me/talks/dotty-tutorial/#/1/13 (slide 15"Type inference and union types"): "By default, Dotty does not inferunion types, they are approximated by a non-union supertype. Uniontypes can be "too precise" and prevent legitimate code from compiling"


另请参阅 23:38 中的提及演讲“Dotty 和类型:到目前为止的故事”。
然而,联合的扩大仅执行 一次 根据 smarter 避免无限 LUB :

when we do the widening once, the resulting type might have a unionsomewhere (like the example in the section Join of a union type inthe doc), we won't widen that if we did do the widening recursively,we could get an infinite lub indeed

关于scala - Dotty 如何决定如何推断/何时扩大联合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63926855/

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