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

如何在Scala 3中实现类型级加法?

在Scala 3中实现类型级加法操作

直接在类型层面使用S + T无法编译,因为Scala 3不会自动将单例Int类型的加法映射为对应的结果类型。我们需要借助类型类结合编译期API来实现类型级的加法逻辑,具体步骤如下:

1. 定义类型级加法的类型类

这个类型类负责关联两个输入单例Int类型与它们的和类型:

trait TypeLevelAdd[S <: Int & Singleton, T <: Int & Singleton, R <: Int & Singleton]

object TypeLevelAdd {
  // 利用编译期API自动推导任意单例Int的加法实例
  inline given [S <: Int & Singleton, T <: Int & Singleton]: 
    TypeLevelAdd[S, T, ${scala.compiletime.intValue[S] + scala.compiletime.intValue[T]}] with {}
}

这里通过scala.compiletime.intValue在编译期获取S和T的数值,计算和后映射为对应的单例Int类型,自动生成类型类实例。

2. 修改Foo类实现bar方法

在bar方法中引入类型类约束,让编译器能推导出加法后的结果类型:

case class Foo[S <: Int & Singleton](value: Double) {
  def bar[T <: Int & Singleton](that: Foo[T])(using 
    TypeLevelAdd[S, T, R]
  ): Foo[R] = Foo[R](this.value * that.value)
}

3. 测试代码

val t1 = Foo[1](1.5)
val t2 = Foo[1](2.0)

val t3 = t1 bar t2 // 编译期推导类型为Foo[2],运行时值为3.0
println(t3) // 输出:Foo(3.0)

关键说明

  • 单例Int类型(Int & Singleton)是Scala 3的字面量类型特性,确保类型参数是具体的数值(如1、2)而非泛型Int。
  • 编译期API的使用让我们无需手动为每一对数值编写类型类实例,大幅减少重复代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:14