Ну касательно (a)
Если типы не корректно спроектированы
компилятор не пропустит.
Если корректно, но есть ошибки в логике, ну чудес не бывает, голова нам дана не орехи колоть.
насчет (b)
От логических ошибок страховки не бывает.
Если нужно делить на 5 а поделили на 4 это косяк программиста а не инструмента.
А если компилятор пропустил деление на ноль, и об этом узнали после релиза,
я склонен считать что с инструментом есть некие проблемы.
Если программа проходит согласование по типам, она работоспособна при правильной реализации.
Каких то существенных проблем ленивость не вызывает, а плюсы дает.
К тому же всегда есть возможность выбора как связывать вычисления (пресловутые монады)
И кстати всегда есть выбор:
Prelude> take 0 undefined
[]
Prelude> take 0 $! undefined
*** Exception: Prelude.undefined
первый вариант — lazy
второй — strict
Пусть будет дизайн.
Только в примере мы получаем дизайн программы, и знаем что она будет работать.
Единственное что нам нужно, дописать реализацию функций с известной сигнатурой.
Ради интереса нарыл реализацию на java подобие
На мой взгляд логику работы понять весьма проблематично.
Хотя каждому свое.
Вначале описали типы данных.
потом написали названия функций и их типы (из каких типов какие получаем)
реализация функций undefined
когда по типам программа корректна, только тогда начали реализацию логики.
По сути, прототип корректной программы не содержал ни одной реализации логики.
Если нет желания использовать State и Maybe,
можно взять Data.Either
data Either a b = Left a | Right b
Это тоже монада и вычисления связываются точно также.
Только если будет ошибка она у вас будет Left «что случилось»
если все ок, то Right ответ сервера
Nothing это и есть exception для чистых вычислений (для данного примера).
В реальном коде там еще будет State монада, чтоб получить правильный код ответа сервера (404, 503 и тд)
Но при этом нарисованный код останется таким же.
Если типы не корректно спроектированы
компилятор не пропустит.
Если корректно, но есть ошибки в логике, ну чудес не бывает, голова нам дана не орехи колоть.
насчет (b)
От логических ошибок страховки не бывает.
Если нужно делить на 5 а поделили на 4 это косяк программиста а не инструмента.
А если компилятор пропустил деление на ноль, и об этом узнали после релиза,
я склонен считать что с инструментом есть некие проблемы.
первый вариант — lazy
второй — strict
Каких то существенных проблем ленивость не вызывает, а плюсы дает.
К тому же всегда есть возможность выбора как связывать вычисления (пресловутые монады)
И кстати всегда есть выбор:
Prelude> take 0 undefined [] Prelude> take 0 $! undefined *** Exception: Prelude.undefined
первый вариант — lazy
второй — strict
Только в примере мы получаем дизайн программы, и знаем что она будет работать.
Единственное что нам нужно, дописать реализацию функций с известной сигнатурой.
Ради интереса нарыл реализацию на java
подобие
На мой взгляд логику работы понять весьма проблематично.
Хотя каждому свое.
потом написали названия функций и их типы (из каких типов какие получаем)
реализация функций undefined
когда по типам программа корректна, только тогда начали реализацию логики.
По сути, прототип корректной программы не содержал ни одной реализации логики.
Или что то не так?
Игра 15
только роль объекта играет лямбда.
Через нее реализуются все остальные кирпичики программ в функциональной парадигме.
В частности, к монадам относятся:
IO (монада строго последовательных вычислений): стратегия связывания — «сначала первое вычисление, затем второе»;
По сути:
любой код на любом языке програмирования как минимум использует монаду IO (в терминах haskell)
Смеяться можно всем миром.
У erlang сложнее.
При этом haskell
позволяет спрототипировать приложение не написав ни одной реализации функции.
Классическая разработка от полного к частному.
Примеры можете посмотреть в ссылке выше.
А для C# наверно речь идет про Nullable Type, как намекает msdn.
Кроме haskell и erlang языков не знаю.
это одно
а если с оговоркой то:
String -> Maybe String
или
Maybe String -> Maybe String
Типы данных используются другие.
И внутренняя реализация.
А пример остается валидным.
И веб на ней также окучивается как на императивных языках, и зачастую сильно проще.
И справка из википедии:
Lisp — 1958
Erlang — 1986
ML — 1979
Haskell — в конце 80
можно взять Data.Either
Это тоже монада и вычисления связываются точно также.
Только если будет ошибка она у вас будет Left «что случилось»
если все ок, то Right ответ сервера
Не нравится можете использовать другой синтаксис.
В некоторых случаях такая запись очень удобна.
В реальном коде там еще будет State монада, чтоб получить правильный код ответа сервера (404, 503 и тд)
Но при этом нарисованный код останется таким же.