Я реализую алгоритм комбинаторной оптимизации в 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?