Подтвердить что ты не робот

Ошибка обработки монадов в Scala? Попробовать vs Validation

scalaz.Validation считается более мощным, чем монада Try, поскольку он может накапливать ошибки.

Есть ли случаи, когда вы можете выбрать Try над scalaz.Validation или scalaz.\/?

4b9b3361

Ответ 1

Самый важный аргумент в пользу Try заключается в том, что он находится в стандартной библиотеке. Он также используется в стандартной библиотеке, например, обратные вызовы, которые вы регистрируете с помощью Future onComplete, должны быть функциями от Try. Его можно использовать более широко в стандартной библиотеке в будущем.

Тот факт, что он в стандартной библиотеке также означает, что он будет выглядеть знакомым для большего количества людей. Вероятно, вы захотите найти его в других сторонних библиотеках, которые вы используете. И, конечно, иногда вам не разрешается использовать Scalaz (или любые другие зависимости) или, возможно, захотите избежать Scalaz по другим вполне веским причинам.

Другие вещи: я не помню, как в прошлый раз я написал \/, у которого не было Throwable с левой стороны (у меня - это просто не то, что я часто делаю). Try испекает это, поэтому вам не нужно беспокоиться о написании псевдонима или что-то еще.

Как отмечает senia в комментариях выше, возможно, что-то мало неинтересное относительно смещения однотипного типа, но все еще использующего язык "слева" и "right" (как \/ есть и делает). Почему \/ связывается с правой стороны? Потому что это так, поэтому. Я лично не нахожу, что это было неприемлемо, но я могу понять, почему некоторые люди могут это сделать. Try устраняет проблему, имея имена конструкторов, которые четко указывают их семантику: Success и Failure, а не Left и Right или -\/ и \/-.

Теперь, когда мы получаем совершенно поверхностные и субъективные причины использовать Try, некоторые люди могут просто подумать, что \/ и -\/ и \/- являются уродливыми. Я вообще не против оператора тяжелого кода, и я нахожу беспорядок косых черт и тире действительно неприятным для ввода и чтения.

Итак, это некоторые аргументы в пользу Try, как и требовалось, но я завершу, сказав, что я никогда не использую его сам. Я не особо забочусь о том, что он нарушает законы монады (хотя я могу понять, почему люди это делают), но я найти \/ и Validation гораздо менее ad-hoc и проще рассуждать, и мне нравится иметь доступ к обоим (Validationкогда я хочу накапливать ошибки, \/ когда мне нужно монадическое упорядочение) в одной структуре.