使用 Result monad comprehension 强制执行错误类型

Enforce error type with Result monad comprehension

我有一个 Result<V, E> 类型,其中 V 是值类型,E 是错误类型。

我正在尝试实现 monad 理解,这样我就可以做到这一点:

val result: Result<Int, String> = binding {
    val value = someMethodReturningResult().bind()
    val value2 = someOtherMethodReturningResult().bind()

    value + value2
}

我尝试实现 bind() 方法以在结果失败时抛出包含错误的异常,否则 return 值。

因此,binding 函数包含一个 try/catch,其中 return 是一个带有抛出错误或 returned 值的 Result

由于异常不能包含泛型类型,我必须在抛出之前将错误转换为 Any,然后在 catch 块中将其转换回。虽然这有效,但它不是类型安全的。 有人可能会添加对 someThirdMethodReturningResult().bind() 的调用,它有另一种错误类型,这是不允许的。

有什么方法可以强制对 bind() 的每次调用都具有相同的错误类型吗?

我可以想象也许做类似

的事情
class BindingContext<E> {
  fun <T> Result<T, E>.bind(): T
}
fun <T, E> binding(block: BindingContext<E>.() -> T): Result<T, E>

...其中BindingContextthisbind方法是Result上的扩展函数,只存在于BindingContext ].