штуки разворачивать, если у вас например по нажатию кнопки надо вызвать три разных метода с бэка, и потом с результатами что-то сделать? Может есть какие-то приёмы, чтобы это удобно делать? Только поменьше, чем Arrow)
Пример нужен? Если вдруг не знаешь, что это
Можешь какой-то пример привести? Какие данные и как ты хочешь обработать. Потому что огромная часть решается простыми операторами, на манер flatMap.
Да просто сделать три запроса к бэку и потом все их результаты скомбинировать и вернуть из функции. На обычных корутинах это будет просто три строчки кода. А если каждый из них возвращает Result, это будет больше похоже на Rx код со всеми zip и flatMap. Я поэтому и хочу посмотреть пример кода, который считается идиоматичной или хотя бы просто хорошей реализацией railway подхода на Котлине, и понять какие-нибудь его весомые преимущества.
>это будет больше похоже на Rx код со всеми zip и flatMap Да, так и будет. Условно. firstRequest() .flatMap(::secondRequest) .flatMap(::thirdRequest) .fold( (err) {}, (res) {}, )
А в чем преимущество?
А в чём недостатки?) Так, в случае ошибки где-то по цепочке ты сразу её и получишь, не проходя дальше и всегда будешь обрабатывать ошибки и успешные результаты в фолде. Аналогично с каким-нибудь зипом и другими операторами, с поправкой на их логику.
Я не вижу отличий от заворачивания этого всего в try-catch без всяких result.
Очевидно же, что отличие в стиле дальнейшей работы? В случае с выбрасыванием исключений — тебе надо где-то на местах вызовов обрабатывать, в случае с котлином это ещё и пропустить легко. А с Either у тебя уже в месте вызова контракт подразумевает обработку ошибки, т.к. ожидает две функции при развертывании на оба случае. Да и цепочки действий в таком случае, как по мне, выглядят приятнее и проще. Но там уже вкусовщина, разумеется. Просто не понимаю проблемы:)
Вот, надо обозначить проблему. Был обычный Котлин: функции возвращают значения и кидают исключения. Кто-то пришел и говорит, есть проблема! И чтобы её решить, функции теперь возвращают Result и не кидают исключения, а весь код вы должны писать через fold и flatmap. Вопрос: чем стало лучше, какая проблема решена?
Мне кажется ты намешал. Это два параллельных подхода, которые существовали задолго до появления котлина. И никакого «было так — плохо, но мы принесли result — стало хорошо» нет. Просто далеко не всем нравится кидать исключения и отлавливать их на месте вызова. Особенно когда сам котлин отодвинулся чуть дальше от этого подхода, отказавшись от Checked Exceptions. И существует альтернатива в лице монад и цепочных вызовов. Дальше просто исходя из своего вкуса действуем.
Исторически согласен, я говорил с точки зрения человека, который использовал обычный котлин, и увидел эти рельсы. То есть основной профит - это внёсение ошибки в сигнатуру функции? То есть, снова checked exception?
Я бы сказал, что основной профит в "традиционной" разработке как-раз обычная возможность получить один из двух вариантов из функции. Именно за таким делам встречал Either в разных проектах чаще всего, без использования всех остальных особенностей. Даже обработку в фолде не всегда встретишь 🙄
Обсуждают сегодня