如何在Arrow-kt中为EffectScope内的bind()方法创建别名?
解决Arrow-kt中为EffectScope的Either.bind()创建别名的问题
你的猜测没错,问题确实出在EffectScope上。原bind()方法是EffectScope接口的扩展函数,只能在EffectScope的上下文里调用。你之前写的扩展函数没有关联到EffectScope,所以编译器找不到对应的原bind()实现。
正确的别名实现方式
要创建bind()的别名,需要把自定义方法同样定义为EffectScope的扩展函数,同时对齐泛型参数:
import arrow.core.Either import arrow.core.continuations.EffectScope // 写法1:作为EffectScope的扩展函数接收Either参数 public suspend fun <R, B> EffectScope<R>.bindMy(either: Either<R, B>): B = either.bind() // 写法2:作为Either的扩展函数,自动继承EffectScope上下文约束 public suspend fun <R, B> Either<R, B>.bindMy(): B = this.bind()
第二种写法和你最初的代码结构类似,但因为原bind()依赖EffectScope上下文,这个bindMy()会自动继承该约束,只能在EffectScope(比如effect、either代码块)中调用。
使用示例
在effect块中调用别名方法:
import arrow.core.continuations.effect import kotlinx.coroutines.runBlocking fun main() = runBlocking { val result = effect<String, Int> { val success = Either.Right(42) success.bindMy() // 调用自定义别名方法 } println(result) // 输出 Right(42) }
泛型扩展说明
如果需要让别名支持更宽泛的错误类型匹配,可以调整泛型约束:
public suspend fun <F, S> EffectScope<F>.bindMy(either: Either<F, S>): S = either.bind()
这样在EffectScope<F>的上下文中,任何Either<F, S>类型的实例都能调用bindMy()。
内容的提问来源于stack exchange,提问作者Rolintocour
相关产品推荐
相关产品推荐

