metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-02-05 10:13 am

Заебатая тема: исключения как монады

Мы тут как-то с [livejournal.com profile] theiced спорили за исключения vs коды ошибок (или null), когда он на дотнете кромешный ад писал.

Вот тут по ссылке http://ivan-gandhi.livejournal.com/1867305.html все расписано самоочевидным образом, чем печальны null, чем хороши исключения, и почему вообще положено использовать Option (Maybe T) в качестве типа для возвращения результата.

У исключений есть еще ценное свойство, которое в Maybe особо не эмулируешь, а в Either будет закат солнца вручную - стеки вызовов. Ну и разные типы ошибок в Maybe тоже не засунешь, Nothing он и есть Nothing. В Either их тоже особо не засунешь, без заворачивания в алгебраический тип по одному конструктору на каждый вид исключения(oh shit, в жабе же все равно исключения checked, это примерно оно и есть).

[identity profile] blackyblack.livejournal.com 2012-02-05 07:31 pm (UTC)(link)
Немного сумбурно - сложновато вас читать. :) Чем плох тупл в обычном виде? Я использовал в эрланге - очень доволен.

[identity profile] metaclass.livejournal.com 2012-02-05 07:51 pm (UTC)(link)
Туплу нужны оба значения пары, а вариантному типу - один из. В случае результата или ошибки, двух значений одновременно быть не может, поэтому тупл тут негоден.

[identity profile] blackyblack.livejournal.com 2012-02-05 07:55 pm (UTC)(link)
Я под туплом имею в виду другую пару. В случае ошибки возвращается тупл {error, Reason}, в случае успеха тупл {ok, Value}. При этом, благодаря тому, что единственное значение можно понимать как тупл с пустым вторым значением, можно честно вернуть ok в случае успеха. Очень удобно.

[identity profile] gds.livejournal.com 2012-02-05 09:47 pm (UTC)(link)
ага, если в эрланге, то всё понятно. Там таким способом представляют sum types. И, действительно, способ удобен для эрланга, в json мне он тоже очень нравится.
А в типизированной функциональщине (в среднем её случае) проявляется такой момент: если функция возвращает тупл, то оба компонента имеют фиксированный тип, то есть, если первый компонент будет представлять "тег" (ok/error), то второй компонент будет обязан иметь какой-то один тип. Если представить ошибку, например, строкой, то и успешный результат будет должен иметь тип строки.
Оттуда и необходимость в индуктивных типах данных -- чтобы разнотипные значения, которые могут включаться в значения данного типа, можно было разделить по тегу, а затем и протипизировать по содержимому (это если грубо передавать "машинерию" процесса).

[identity profile] gds.livejournal.com 2012-02-05 09:56 pm (UTC)(link)
криво сформулировал. предпосылка про первый компонент тупла всегда верна, поэтому текст

"если первый компонент будет представлять "тег" (ok/error), то"

проще исключить из комментария для простоты восприятия.

[identity profile] kurilka.livejournal.com 2012-02-05 08:21 pm (UTC)(link)
Ну в Эрланге нельзя определять свои типы (рекорды тоже лишь сахарок), поэтому вот и получаются тэги типов "ручками"