Лучше использовать монаду State или рекурсивно передавать состояние?

Я просто изучаю Haskell и пытаюсь найти наиболее идиоматический способ реализации алгоритма прямой видимости.

Демонстрационный код, который я нашел, использует монаду состояния, но мне кажется проще (я только начинаю) передавать состояние рекурсивно. Что мне здесь не хватает? Есть ли проблемы с производительностью?

Найдите код по адресу: http://www.finalcog.com/bresenham-algorithm-idiomatic-haskell

Спасибо,

Крис.


person fadedbee    schedule 21.09.2009    source источник
comment
Ну, рекурсия может быть медленнее и привести к росту вашего стека   -  person Tom Neyland    schedule 21.09.2009
comment
@Tnay Recursion также может быть быстрее и работать в постоянном пространстве стека.   -  person Amok    schedule 21.09.2009
comment
Стоит отметить, что монада State и монада ST (State Thread, которую использует ваша статья) — это не одно и то же.   -  person jrockway    schedule 23.09.2009


Ответы (3)


Передавать состояние везде может стать немного многословно. Кроме того, монада состояния хорошо известна большинству программистов на Haskell, поэтому они будут знать, что вы делаете. Если вы вручную создаете свой собственный код вне монады, может быть сложно понять, что делает ваш код.

Я считаю, что монада состояния удобна для инкапсуляции изменений состояния, довольно очевидно, какая часть вашего кода имеет состояние (т.е. изменяется или зависит от состояния) w.r.t. остальное чистое вещество.

person Macke    schedule 21.09.2009
comment
Также важно научиться правильно использовать монады, поэтому их использование в ситуации, когда вы знаете, как добиться того же самого в противном случае, может быть хорошим способом обучения. - person Amok; 22.09.2009

Для больших программ лучше скрыть передачу состояния в монаде. Тогда меньше риск ошибки.

person Don Stewart    schedule 21.09.2009

Преимущество использования монады для передачи состояния по сравнению с явной передачей состояния состоит в том, что для монад определено множество полезных комбинаторов, которые вы можете использовать.

person ChrisBlom    schedule 07.05.2012