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

Scala 3中无法创建ContextFunction1匿名实现的问题咨询

解决Scala 3中ContextFunction1匿名实现的编译错误

问题分析

你的代码编译报错的核心原因是:Scala 3的Raise[E] ?=> A是ContextFunction1[Raise[E], A]的语法糖,但直接返回匿名ContextFunction1实例时,编译器无法正确推断表达式的整体类型,误将匿名类中apply方法的返回值A当成了整个表达式的返回类型,导致与函数声明的返回类型Raise[E] ?=> A不匹配。

解决方案

方案1:使用Context Function字面量语法(推荐)

Scala 3提供了更简洁的context function字面量写法(using C) => R,直接对应ContextFunction1[C, R],编译器能正确识别类型:

def mem[E, A](block: Raise[E] ?=> A): Raise[E] ?=> A = 
  (using r: Raise[E]) => block(using r)

方案2:显式约束匿名类类型(不推荐,冗余)

如果一定要保留匿名类写法,需要显式让编译器知道匿名类的类型是ContextFunction1[Raise[E], A],可以通过类型标注实现:

def mem[E, A](block: Raise[E] ?=> A): Raise[E] ?=> A = 
  new ContextFunction1[Raise[E], A] {
    override def apply(using r: Raise[E]): A = block(using r)
  }: ContextFunction1[Raise[E], A]

不过这种写法冗余,不如字面量写法简洁。

补充说明

传统Function1没有编译错误,是因为Function1的语法糖和类型推断逻辑与context function不同,编译器能正确识别匿名Function1实例的类型并完成适配。

内容的提问来源于stack exchange,提问作者riccardo.cardin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:12:40