All streams
Search
Write a publication
Pull to refresh
@chemistmailread⁠-⁠only

Пользователь

Send message
Ну касательно (a)
Если типы не корректно спроектированы
компилятор не пропустит.
Если корректно, но есть ошибки в логике, ну чудес не бывает, голова нам дана не орехи колоть.
насчет (b)
От логических ошибок страховки не бывает.
Если нужно делить на 5 а поделили на 4 это косяк программиста а не инструмента.
А если компилятор пропустил деление на ноль, и об этом узнали после релиза,
я склонен считать что с инструментом есть некие проблемы.
Сорри парсер.
Prelude> take 0 undefined [] 
Prelude> take 0 $! undefined 
*** Exception: Prelude.undefined 

первый вариант — lazy
второй — strict
Если программа проходит согласование по типам, она работоспособна при правильной реализации.
Каких то существенных проблем ленивость не вызывает, а плюсы дает.
К тому же всегда есть возможность выбора как связывать вычисления (пресловутые монады)

И кстати всегда есть выбор:
Prelude> take 0 undefined [] Prelude> take 0 $! undefined *** Exception: Prelude.undefined
первый вариант — lazy
второй — strict
Пусть будет дизайн.
Только в примере мы получаем дизайн программы, и знаем что она будет работать.
Единственное что нам нужно, дописать реализацию функций с известной сигнатурой.

Ради интереса нарыл реализацию на java
подобие
На мой взгляд логику работы понять весьма проблематично.
Хотя каждому свое.
Вначале описали типы данных.
потом написали названия функций и их типы (из каких типов какие получаем)
реализация функций undefined
когда по типам программа корректна, только тогда начали реализацию логики.

По сути, прототип корректной программы не содержал ни одной реализации логики.

Или что то не так?
) Ну да.
только роль объекта играет лямбда.
Через нее реализуются все остальные кирпичики программ в функциональной парадигме.

) процитирую википедию:

В частности, к монадам относятся:
IO (монада строго последовательных вычислений): стратегия связывания — «сначала первое вычисление, затем второе»;

По сути:
любой код на любом языке програмирования как минимум использует монаду IO (в терминах haskell)

Смеяться можно всем миром.
QuickCheck для haskell, но там не может быть типа с оговорками.
У erlang сложнее.

При этом haskell
позволяет спрототипировать приложение не написав ни одной реализации функции.

Классическая разработка от полного к частному.
Примеры можете посмотреть в ссылке выше.
Erlang далеко не чистый функциональный язык,

А для C# наверно речь идет про Nullable Type, как намекает msdn.
Хотя при строгой типизации, сигнатура функции с оговорками мне вообще не понятна.

Тут я не советчик.
Кроме haskell и erlang языков не знаю.
String -> String
это одно

а если с оговоркой то:
String -> Maybe String
или
Maybe String -> Maybe String
И потом первая залетевшая ворона разрушит цивилизацию. ))
Кстати нет.
Типы данных используются другие.
И внутренняя реализация.
А пример остается валидным.
Это не велосипеды, это функциональная парадигма.
И веб на ней также окучивается как на императивных языках, и зачастую сильно проще.

И справка из википедии:
Lisp — 1958
Erlang — 1986
ML — 1979
Haskell — в конце 80
Если нет желания использовать State и Maybe,
можно взять Data.Either
data Either a b = Left a | Right b

Это тоже монада и вычисления связываются точно также.
Только если будет ошибка она у вас будет Left «что случилось»
если все ок, то Right ответ сервера

Храним состояние в State монаде, и ответ берем оттуда.
Это математическая нотация.
Не нравится можете использовать другой синтаксис.
В некоторых случаях такая запись очень удобна.
Nothing это и есть exception для чистых вычислений (для данного примера).

В реальном коде там еще будет State монада, чтоб получить правильный код ответа сервера (404, 503 и тд)
Но при этом нарисованный код останется таким же.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity