[Haskell-beginners] Re: State monad question

Heinrich Apfelmus apfelmus at quantentunnel.de
Thu Jun 24 03:20:55 EDT 2010

Jordan Cooper wrote:
> Secondly, as to why I wanted to use a monad here, importantFunction
> (which is called playerTurn in the real program) would contain a
> series of functions that would modify Cards and Players, not just one
> each as in my initial example. Thus it seems like I'd have to end up
> with let foo... let foo'... etc. which, from my reading in RWH, seems
> to be an acceptable use for a State monad.

While your use of the state monad may well be sensible, keep in mind 
that many cases of "threading state" are covered by ordinary functional 
programming idioms, like function composition

     process = take 3 . sort . map length . filter (not . null) . lines

and accumulating parameters

     average xs = foldl' step (0,0) xs
         step (!s,!n) x = (s+x, n+1)

     reverse xs = go xs
         go ys []     = ys
         go ys (x:xs) = go (x:ys) xs

The functions in  Data.Map  are a good example as well: most of them 
"change" the map, but a state monad would be overkill for that.

The state monad is mainly beneficial when you otherwise would have many 
functions of type

     :: s -> (a,s)

with ugly plumbing like

     let (a,s') = foo s; (b,s'') = foo s' in ..

Heinrich Apfelmus


More information about the Beginners mailing list