У меня есть рекурсивная функция, которая получает объект данных с количеством полей, например:
data MyState = {
first :: Int,
second :: String,
third :: Bool,
...
}
type Result = Int
Эта рекурсивная функция изменяет его во время выполнения и передает его себе для следующего выполнения. Это выглядит следующим образом:
-- This is a pseudocode, just to give an idea about the workflow.
process :: MyState -> Result
process st = go st
where go st | first == 1 = (go . changeFunc1) st
| first == 2 = (go . changeFunc2) st
| otherwise = generateResult st
changeFunc1 :: MyState -> MyState
changeFunc1 st | third st == True && second st == "abc" = st {first = inc}
| otherwise = st
where inc = first st + 1
...
В этом случае вместо передачи параметра MyState между функциями я мог бы использовать монаду State, и мне нужно было бы постоянно монтировать / разворачивать монаду. Я относительно новичок в Haskell и мне нужна рекомендация, какой подход лучше в моем случае. Спасибо.