Scala 3:如何让依赖函数类型代码通过类型匹配编译?
Scala 3依赖函数类型编译问题解决方案
首先还原你的问题代码,方便理解场景:
trait Key: type Value object Name extends Key: type Value = String object Age extends Key: type Value = Int type DB = (k: Key) => Option[k.Value] // 原无法编译的实现 val dbImpl: DB = (k: Key) => k match case Name => Some("abc") // 编译器无法识别此处k.Value对应String case Age => Some(25)
问题原因
Scala 3的依赖函数类型(k: Key) => Option[k.Value]要求返回值类型必须严格匹配输入k的具体子类型对应的Value关联类型。原代码中case Name仅匹配单例对象,但编译器无法自动将k的类型细化为Name.type,因此无法关联k.Value就是String,导致类型不匹配。
可行修改方案
方案1:使用带类型的模式绑定
通过类型模式明确指定k的具体子类型,让编译器追踪到对应的关联类型:
val dbImpl: DB = (k: Key) => k match case _: Name.type => Some("abc") case _: Age.type => Some(25)
方案2:使用Scala 3的inline match
利用inline编译期展开特性,让编译器在编译阶段明确匹配分支的类型关联:
val dbImpl: DB = inline (k: Key) => inline k match case Name => Some("abc") case Age => Some(25)
方案3:显式标注分支返回类型
给每个match分支的返回值标注Option[k.Value],强制类型对齐:
val dbImpl: DB = (k: Key) => k match case Name => Some("abc"): Option[k.Value] case Age => Some(25): Option[k.Value]
以上三种方案均可解决编译问题,其中方案1和方案2更符合Scala 3的类型系统设计原则,可读性和扩展性更好。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

