Заебатая тема: исключения как монады
Мы тут как-то с
theiced спорили за исключения vs коды ошибок (или null), когда он на дотнете кромешный ад писал.
Вот тут по ссылке http://ivan-gandhi.livejournal.com/1867305.html все расписано самоочевидным образом, чем печальны null, чем хороши исключения, и почему вообще положено использовать Option (Maybe T) в качестве типа для возвращения результата.
У исключений есть еще ценное свойство, которое в Maybe особо не эмулируешь, а в Either будет закат солнца вручную - стеки вызовов. Ну и разные типы ошибок в Maybe тоже не засунешь, Nothing он и есть Nothing. В Either их тоже особо не засунешь, без заворачивания в алгебраический тип по одному конструктору на каждый вид исключения(oh shit, в жабе же все равно исключения checked, это примерно оно и есть).
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Вот тут по ссылке http://ivan-gandhi.livejournal.com/1867305.html все расписано самоочевидным образом, чем печальны null, чем хороши исключения, и почему вообще положено использовать Option
У исключений есть еще ценное свойство, которое в Maybe особо не эмулируешь, а в Either будет закат солнца вручную - стеки вызовов. Ну и разные типы ошибок в Maybe тоже не засунешь, Nothing он и есть Nothing. В Either их тоже особо не засунешь, без заворачивания в алгебраический тип по одному конструктору на каждый вид исключения(oh shit, в жабе же все равно исключения checked, это примерно оно и есть).
no subject
1. Всё равно, что там, разбора типа не будет, он не нужен.
2. None и Some x -- оба валидные (для конкретного применения) значения, разбор нужен, обе "ветки" представлены разными кусками кода. "match opt_a with [ None -> proc_none | Some a -> proc_some a ]" выглядит лучше, чем "catch (opt_a >>= proc_some) (fun _ -> proc_none)", тем более, обрабатывается конкретно None, а не "ошибка монады maybe", которая может быть и в proc_some.
3. Some x -- валидное, None -- ошибочное. В этом случае мне всегда нужно выдать что-то внятное (специально следил за подобными случаями, всегда нужно). Хоть тот же "assert False" (который в исключении содержит имя файла + строку + столбец данного assert'а). Либо более подробное сообщение. Либо кинуть более специфическое исключение, "raise (No_phone person_name)". Вариант с монадами потребует как минимум catch, хоть и будет более осмысленно, чем в п.2. А везде, на каждый разбор option 'a лепить как bind, так и catch -- это извращение. Кроме того, можем поймать ошибку разбора более глубокого option 'a.
Итого: монада maybe полезна там, где не суть важно, в каком именно option 'a содержится None. То есть, в стране эльфов.
(функции наподобие container (option 'a) -> option (container 'a) пишутся один раз и под описанное не попадают.)
no subject
Канделябром за брехню! за невежество!
В жабе и чекед есть, и рантайм, и конструктор с произвольной строкой, и вообще эррор, и полный изрыгабль.
А по смыслу полностью согласен.
(no subject)
no subject
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
data SomeException where SomeExceptin :: Typeable a => a -> SomeException
Далее Error SomeException и Either SomeException a.
no subject