Принудительно использовать тип ошибки с пониманием монады результата - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть тип Result<V, E>, где V - это тип значения, а E - это тип ошибки.

Я пытаюсь реализовать монадное понимание так, чтобы я мог сделать это:

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

    value + value2
}

Я попытался реализовать метод bind(), чтобы вызвать исключение, содержащее ошибку, если результатом является сбой, или же вернуть значение.

Следовательно, функция binding содержитtry / catch, который возвращает Result с либо сгенерированной ошибкой, либо с возвращенным значением.

Поскольку исключения не могут содержать универсальные типы, я должен преобразовать ошибку в Any до выброса, а затем вернуть ее обратнов блоке улова.Хотя это работает, это не безопасно.Кто-то может добавить вызов к someThirdMethodReturningResult().bind(), который имеет другой тип для ошибки, и это не должно быть разрешено.

Есть ли способ обеспечить, чтобы каждый вызов к bind() имел одинаковый тип дляошибка?

1 Ответ

2 голосов
/ 25 сентября 2019

Я могу представить, что возможно делает что-то вроде

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.

...