2009-09-21 5 views
9

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

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

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

Спасибо,

Криса.

+0

Ну рекурсия может быть медленнее и привести к росту вашего стека. –

+7

@Tnay Recursion также может быть быстрее и работать в постоянном пространстве стека. – Amok

+5

Стоит отметить, что монада штата и ST («Государственная нить», используемая вашей статьей) монады не совпадают. – jrockway

ответ

11

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

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

+1

Важное значение имеет также изучение способов использования монад, поэтому использование их в ситуации, когда вы знаете, как выполнить то же самое, в противном случае может быть хорошим способом обучения. – Amok

10

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

3

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