You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala 3 传入Wrapper("yo")报No singleton value错误是预期行为吗

Scala 3 单例类型编译问题分析

问题现象

编译失败抛出的错误信息如下:

No singleton value available for A
where: A is a type variable with constraint >: ("yo" : String) and <: Singleton

问题代码示例:

case class Wrapper[A <: Singleton](a: A)(using ValueOf[A])

def test[A <: Singleton](blabla: Wrapper[A]): Unit = ()

test(Wrapper("yo"))

将Wrapper("yo")提取为独立变量后即可正常编译:

case class Wrapper[A <: Singleton](a: A)(using ValueOf[A])

def test[A <: Singleton](blabla: Wrapper[A]): Unit = ()

val value = Wrapper("yo")
test(value)

结论

这是Scala 3的预期行为,不属于Bug,差异来自Scala 3类型推断规则在不同上下文下的处理逻辑。

原因说明

  • 直接嵌套传参的场景:当Wrapper("yo")作为参数直接传入test时,编译器会先从test的参数定义做反向类型推导,此时Wrapper的类型参数A会被临时推断为一个带有上下界的未确定类型>: "yo" <: Singleton,而非确定的单例类型"yo"。而ValueOf类型类的自动给定实例仅能针对确定的单例类型生成,这种未定型的中间类型没有对应的ValueOf实例,因此编译报错。
  • 提取为val的场景:当Wrapper("yo")被绑定到一个独立val时,没有外部的反向类型推导约束,编译器会直接根据入参"yo"将A推断为确定的单例类型"yo",此时可以自动生成ValueOf["yo"]实例,因此编译正常。

替代解决方案

如果不想提取独立变量,可以手动指定Wrapper的类型参数即可编译通过:

test(Wrapper["yo"]("yo"))

内容的提问来源于stack exchange,提问作者Fabio Epifani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 17:36:07