Я реализую комбинаторный алгоритм оптимизации в Haskell:
Given an initial candidate solution, repeat until stopping criteria are met:
1. Determine possible moves
2. Evaluate possible moves
3. Choose a move
4. Make move, record new candidate solution, update search state
Я мог бы написать функции для шагов 1–4 и связать их вместе внутри рекурсивной функции для обработки цикла и передачи состояния от одной итерации к другой, но у меня есть смутное представление эти монады применяются.
Как лучше всего выразить такую процедуру в Haskell?