_От переводчика: Это вольный перевод статьи [«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