Имеет ли смысл использовать Monad, когда ваш код не безобразен без него? - PullRequest
6 голосов
/ 21 января 2020

У меня есть рекурсивная функция, которая получает объект данных с количеством полей, например:

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 и мне нужна рекомендация, какой подход лучше в моем случае. Спасибо.

...