Строгая типизация существует уже давно, как и алгольно-паскльное различение процедур и функций, с обязательным требованием что-то сделать со значением, возвращаемым функцией.
> Ярким примером является энкапсуляция ошибок и обязательности возможности наличия данных - монадки Must и Maybe. Типы данных требуют для Maybe, чтобы все обработчики этих данных умели обработать случай None (т.е. реальных данных нет), а Must - не даст сделать код, который "иногда, очень-очень редко" вернёт None вместо файлового дескриптора. > Ещё интереснее обработка ошибок. Если мы описываем монадку, которая состоит из Data|None|Error, то если мы в каком-то месте забудем сказать, что делать если там ошибка (например, на пятом уровне по стеку вверх), то программа не скомпилируется.
Это все происходит от специфической убогости их языка. У них нету даже циклов, не говоря уже про break/continue. Вместо того все вытягивается в конвейеры, в которых последующим стадиям приходится уметь обратабывать все, что производится предудыщими стадиями.
Но и для конвейеров есть более просто решение - пропускать насквозь все, что не знаешь как обработать. Это решение очень краеугольно во всем современном программировании, в особенности в ООП, и приводит к большому повышению эффективности работы программистов. Но в их убогом языке его применять невозможно по той простой причине, что и присваивания у них тоже нет. Поэтому приходится все обрабатывать вручную, и при любом мелком изменении в первых стадиях конвейера их карточный домик начинает рассыпаться.
> Принудительное разделение на "чистый" код и код в монадке IO позволяет легко рефакторить этот самый чистый код, потому что его элементарно покрыть тестами и там нет ничего, чтобы могло "сломать что-то другое".
Это очень-очень неправильная идея, из очень многих соображений. Начать можно с простого соображения: фокус в том, что "чистый код" ничего не делает и никому не нужен. А если его пытаться сделать нужным, то он у них делается просто жутким. После этого можно на остальны соображения даже не смотреть.
> Ах, да, ещё pattern matching - это когда у компилятора достаточно информации о типах, чтобы сказать, что мы "забыли" какой-то из case'ов в switch'е (если на сишном языке говорить).
Нынешние сишные компиляторы умеют выдавать такие предупреждения.
no subject
Date: 2016-03-07 08:37 pm (UTC)> Ярким примером является энкапсуляция ошибок и обязательности возможности наличия данных - монадки Must и Maybe. Типы данных требуют для Maybe, чтобы все обработчики этих данных умели обработать случай None (т.е. реальных данных нет), а Must - не даст сделать код, который "иногда, очень-очень редко" вернёт None вместо файлового дескриптора.
> Ещё интереснее обработка ошибок. Если мы описываем монадку, которая состоит из Data|None|Error, то если мы в каком-то месте забудем сказать, что делать если там ошибка (например, на пятом уровне по стеку вверх), то программа не скомпилируется.
Это все происходит от специфической убогости их языка. У них нету даже циклов, не говоря уже про break/continue. Вместо того все вытягивается в конвейеры, в которых последующим стадиям приходится уметь обратабывать все, что производится предудыщими стадиями.
Но и для конвейеров есть более просто решение - пропускать насквозь все, что не знаешь как обработать. Это решение очень краеугольно во всем современном программировании, в особенности в ООП, и приводит к большому повышению эффективности работы программистов. Но в их убогом языке его применять невозможно по той простой причине, что и присваивания у них тоже нет. Поэтому приходится все обрабатывать вручную, и при любом мелком изменении в первых стадиях конвейера их карточный домик начинает рассыпаться.
> Принудительное разделение на "чистый" код и код в монадке IO позволяет легко рефакторить этот самый чистый код, потому что его элементарно покрыть тестами и там нет ничего, чтобы могло "сломать что-то другое".
Это очень-очень неправильная идея, из очень многих соображений. Начать можно с простого соображения: фокус в том, что "чистый код" ничего не делает и никому не нужен. А если его пытаться сделать нужным, то он у них делается просто жутким. После этого можно на остальны соображения даже не смотреть.
> Ах, да, ещё pattern matching - это когда у компилятора достаточно информации о типах, чтобы сказать, что мы "забыли" какой-то из case'ов в switch'е (если на сишном языке говорить).
Нынешние сишные компиляторы умеют выдавать такие предупреждения.