[#] [Перевод] Очисти код свободными монадами
habrabot(difrex,1) — All
2015-08-02 01:30:04


_От переводчика: Это вольный перевод статьи [«Purify code using free monads»][1] Габриэля Гонзалеса, посвященный использованию свободных монад для представления кода как синтаксического дерева с последующей управляемой интерпретацией. На хабре имеются другие статьи Габриэля — [«Кооперативные потоки с нуля в 33 строках на Хаскеле»][2] и [«Чем хороши свободные монады»][3]. Все замечания переводчика выделены курсивом. По всем замечаниям, связанным с переводом, обращайтесь в личку._ Опытные программисты на Хаскеле часто советуют новичкам делать программы настолько [чистыми][4], насколько это возможно. _Функция называется чистой, если она детерминированная (возвращаемое значение однозначно определяется значениями всех формальных аргументов) и не имеет побочных эффектов (то есть не изменяет состояние среды исполнения). В классической математике, λ-исчислении и комбинаторной логике все функции чистые._ Чистота предоставляет множество практических преимуществ:

* можно формально доказать какие-то свойства написанного кода,
* кроме того, можно легко обозревать код и сказать, что он делает,
* наконец, можно прогнать через [QuickCheck][5].

Для демонстрации я буду использовать такую простенькую программу `echo`:

import System.Exit

main = do x <- getLine
putStrLn x
exitSuccess
putStrLn "Finished"

В приведённой программе, однако, имеется один недостаток: в ней смешаны бизнес-логика и побочные эффекты. В конкретном случае в этом нет ничего плохого, я всегда так пишу простенькие программы, которые могу целиком держать в голове. Впрочем, я надеюсь вас заинтересовать прикольными штуками, которые получаются, когда побочные эффекты отделены от бизнес-логики. [Читать дальше →][6]

[1]: http://www.haskellforall.com/2012/07/purify-code-using-free-monads.html
[2]: http://habrahabr.ru/post/195274/
[3]: http://habrahabr.ru/post/254715/
[4]: https://ru.wikipedia.org/wiki/Чистота_функции
[5]: http://hackage.haskell.org/package/QuickCheck
[6]: http://habrahabr.ru/post/263959/#habracut