amarao (amarao_san) wrote,
amarao
amarao_san

Category:

haskell non-strict execution (AKA lazyness)

Сегодня ну нас на работе был по этому поводу разговор, мне сказали "это совсем другое дело", но внятного ответа я не услышал.

Суть проблемы: классическим недостатком динамической типизации называют ситуацию, когда кто-то делает в результате 1+none, потому что ему кто-то передал none вместо числа, а none получился, потому что кто-то его вернул (в совсем другом месте программы) и мы молчаливо протащили его через кучу мест, где считалось, что это "очищенный инт", пока он таки не попал на место, где нужно "крякать как инт". В результате программа падает с ошибкой (ну или эксепшен ловится, не важно) совсем не там, где ошибка возникла, то есть вместо обнаружения ошибки "сразу" мы её пускаем гулять по всему datapath, и не факт, что за время тестов она себя хоть раз проявит (например, 1+x выполняется только в редких условиях в редкой ветке кода). Так что правильнее ловить ошибку типизации сразу же (или вообще не позволять собрать программу с неверной типизацией). Поведение питона я бы назвал "ленивой типизацией", потому что питон не шевелится проверять тип, до того момента, когда не нужно начинать __крякать__.

Теперь посмотрим на хаскель с его "ленивым исполнением". Мы получаем некую (вполне валидную) величину из IO. Эта величина скармливается в чистую функцию, которая на его основе генерирует список. Допустим, мы делаем ошибку и список получается бесконечный (хотя мы все ожидаем в этом месте списка конечного). В нормальном (строгом исполнении) мы огребём ошибку в момент генерации списка (сожрём всю память и упадём, или, если подстели ассерта, то просто упадём 'too long list'). Что же сделает хаскель? Он сгенерирует бесконечный список (точнее, запишет себе что его нужно генерировать кодом с параметрами на бесконечность), вернёт его - и этот список пойдёт гулять по коду.

Через некоторое количество времени и мегабайт кода мы оказываемся в редкой ветви кода, где кто-то (будучи уверенным в конечности списка) решает сделать IO для него. И для начала делает length...

Чем это падение отличается от падения питоновской программы на 1+none? (ну, кроме своппинга). Ровно так же ошибка себя не проявляет до момента, когда "лень призывают к ответу" - и в этом смысле "ленивое ошибочное вычисление" ничем не лучше "ленивой ошибочной типизации".
Tags: haskell
Subscribe

  • innernet

    Кто-то с ним работал? https://blog.tonari.no/introducing-innernet Пока что по описанию оно звучит как офигенно.

  • ансибло-философия

    А вот я хочу продолжить думать умное про ансибл, ci/cd и прочую рабочую фигню между гитом и сервером. Классическое программирование стремится…

  • positive nagging

    Для повышения морали в коллективе было решено запретить токсичные и негативные сообщения в чате. Теперь все сообщения в чате выглядят так: Resolved…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 9 comments