Вы можете немного упростить свой код с помощью mapM
и sequence
:
mapM scanEmployee :: [Employee] -> State (Int, Int) [Either String Employee')
sequence :: [ Either String a ] -> Either String [ a ]
(Обратите внимание, что эти сигнатуры типов являются упрощениями, а фактические типы являются более общими. В частности, mapM
и sequence
работать для любой монады (не только Either String
) и любой проходимой (не просто ([])
))
И написать простое решение:
scanTeam = fmap sequence . mapM scanEmployee