在Arrow-kt中,我想为bind()
-创建一个别名,作为一种使用Arrow的自定义库。
我希望下面的代码可以工作,但它没有:
suspend fun <F, S> Either<F, S>.bindMy(): S = this.bind()
我想要的方法是
public interface EffectScope<in R> {
...
public suspend fun <B> Either<R, B>.bind(): B
我猜它没有像我期望的那样工作,因为EffectScope。
你知道我该怎么做吗?Thx
bind
在EffectScope
或Raise
(Arrow 2.0快照)中被定义为Either<A, B>
的扩展方法。
你可以用不同的方法来做这件事。
- 如果您在JVM中,请使用即将到来的上下文接收器特性。
context(EffectScope<E>)
fun <E, A> Either<E, A>.myBind(): A = fold({ shift(it) }, ::identity)
- 扩展
EffectScope
接口并定义您的折叠机器,就像Arrow为EffectScope
和Effect
所做的那样。不幸的是,在上下文接收器可用之前,这是一个更重量级的解决方案。如果您使用2.0快照,其中所有这些都更简单,您将需要提供类似的机制,如Raise和Effect。
如果你需要一些帮助,我们可以在Kotlin slack #Arrow channel中找到