Чем-то похож на этот вопрос , я пытаюсь выяснить, как перемещаться по состоянию Монады Хаскелла.Каждый Employee
в команде заменяется соответствующим Employee'
при сохранении некоторого простого состояния.Вот код:
module Main( main ) where
import Control.Monad.State
data Employee = EmployeeSW Int Int | EmployeeHW Int String deriving ( Show )
data Employee' = EmployeeSW' Int | EmployeeHW' String deriving ( Show )
scanTeam :: [Employee] -> State (Int,Int) [Employee']
scanTeam [ ] = return []
scanTeam (p:ps) = scanEmployee p -- : scanTeam ps ???
scanEmployee :: Employee -> State (Int,Int) Employee'
scanEmployee (EmployeeSW id s) = do
(num,raise) <- get
put (num+1,raise)
return (EmployeeSW' (s+raise))
scanEmployee (EmployeeHW id s) = do
(num,raise) <- get
put (num+1,raise)
return (EmployeeHW' (s++(show raise)))
startState = (0,3000)
t = [(EmployeeHW 77 "Hundred"),(EmployeeSW 66 500),(EmployeeSW 32 200)]
main = print $ evalState (scanTeam t) startState
Я хочу со временем объединить scanEmployee p
с scanTeam ps
, поэтому я попытался извлечь куски scanEmployee p
и каким-то образом склеить их вместе с scanTeam ps
.Пока что я с треском провалился.На самом деле, я даже не уверен, что состояние может быть перемещено между ними (?).