使用 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>
...其中BindingContext
是this
,bind
方法是Result
上的扩展函数,只存在于BindingContext
].
我有一个 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>
...其中BindingContext
是this
,bind
方法是Result
上的扩展函数,只存在于BindingContext
].