Scala 3 嵌套Int列表扁平化递归类型定义与编译栈溢出问题
问题1解答
你的实现运行逻辑是正确的,合法输入下可以输出预期结果,也确实能阻断非Int类型输入的编译,但类型声明存在设计缺陷:
- 你定义的
NestedList[T]中泛型参数T未被任何地方使用,属于完全冗余的定义,本身就没有存在的必要,因为你的需求里所有叶子节点都是固定的Int类型,不需要泛型支持。 - 递归类型引用时使用了通配符
NestedList[_],会导致编译器做类型校验时需要无限展开递归类型结构,这是触发栈溢出的直接原因。
更优的编译时类型检查实现可以简化类型定义,去掉无用的泛型参数即可:
object FlattenArray: type NestedIntList = Int | List[NestedIntList] | Null def flatten(xs: List[NestedIntList]): List[Int] = xs match case (x: Int) :: tail => x :: flatten(tail) case (ys: List[_]) :: tail => flatten(ys.asInstanceOf[List[NestedIntList]]) ::: flatten(tail) case null :: tail => flatten(tail) case Nil => Nil case _ => throw new IllegalArgumentException("This should never happen")
上述实现既保留了编译时类型检查能力,传入包含String等非合法类型的输入时,编译器会直接返回类型不匹配:期望NestedIntList,实际得到String的友好错误提示,不会触发编译器崩溃。
问题2解答
这个栈溢出不是Scala 3的预期失败模式,属于编译器处理带通配符的递归类型别名时的已知缺陷。正常的类型校验失败应该返回用户可理解的类型不匹配提示,而不是编译器自身抛出栈溢出错误崩溃。
内容的提问来源于stack exchange,提问作者Luigi Plinge
相关产品推荐
相关产品推荐

