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
相关产品推荐
相关产品推荐

