[Haskell-cafe] using haskell for a project

Dean Herington heringtonlacey at mindspring.com
Sat May 2 15:26:51 EDT 2009


At 7:17 PM +0200 5/2/09, Nicolas Martyanoff wrote:
>Content-Type: multipart/signed; micalg=pgp-sha1;
>	protocol="application/pgp-signature"; boundary="ibTvN161/egqYuK8"
>Content-Disposition: inline
>
>Hi,
>
>I don't think I already presented myself; I'm Nicolas, a 23y french
>student, trying to learn and use haskell.
>
>I've been using C for years, for all sort of tasks, and am quite
>comfortable with it. I'm also using it 40h a week in my internship for
>network systems, so I kind of know how to use it.
>
>I discovered Haskell some monthes ago, bought `Real World Haskell',
>quickly read, and enjoyed it.
>
>So now I'd want to use it for a small project of mine, a simple
>multiplayer roguelike based on telnet. I wrote a minimal server in C, and
>it took me a few hours. Now I'm thinking about doing the same in Haskell,
>and I'm in trouble.
>
>I don't really know how to map my ideas in haskell code. For example, a
>character can cast spells, so I'd have something like this in C:
>
>     struct hashtable spells;
>
>     struct character {
>         int n_spells;
>         struct spell **spells;
>     };
>
>I thought I could do something like this in haskell:
>
>     spells = Data.Map.Map Int Spell
>
>     data Character = Character { charSpells :: [Int] }
>
>But now I don't know how to dynamically add new spells (new spells can be
>created in my gameplay). Since I can't assign a new value to the `spells'
>variable (Data.Map.insert returns a new map), I just don't know where to
>go.
>
>I have the same problem for a bout every problem. I love writing pure
>functions in haskell, but as soon as I try to write some code involving
>states or side effects, I can't write a line.
>
>I just wanted a 2d array to store a zone, for example, dead simple in C,
>but this kind of link
>http://greenokapi.net/blog/2009/03/10/rough-grids-in-haskell make me
>shiver.
>
>Point is, I'd like to use haskell, but I don't know how, it seems totally
>alien.
>
>How did you manage to change the way you map ideas to code, from
>imperative to pure functional ?
>
>Thank you.
>
>Regards,
>
>--
>Nicolas Martyanoff
>    http://codemore.org
>    khaelin at gmail.com

Nicolas,

First, bienvenue à Haskell !  Learning it will 
stretch your mind; it may be rocky at times, but 
it will be rewarding.

You've quickly come upon a key difference between 
imperative and functional programming.  State 
management in Haskell is more explicit, which is 
a double-edged sword.  It requires greater 
discipline and mechanism, but provides greater 
control and security.

In your example program you could manage your 
state with a State monad.  Assuming you'll want 
to be able to do I/O, you'll probably want to 
combine State with IO.  For starters, something 
like:

>  import Control.Monad.State
>  import qualified Data.Map as M
>
>  data Spell = ...
>  data Character = Character { charName :: String, charSpells :: [Spell], ... }
>  data MyState = MyState { characters :: M.Map String Character, ... }
>  initialState = MyState { characters = M.empty, ... }
>
>  type MyMonad = StateT MyState IO
>
>  addSpellForCharacter :: String -> Spell -> MyMonad ()
>  addSpellForCharacter name spell = do
>      state <- get
>      let chars = characters state
>      case M.lookup name chars of
>          Just char -> let char' = char { 
>charSpells = spell : charSpells char }
>                           state' = state { 
>characters = M.insert name char' chars }
>                       in put state'
>          Nothing   -> ...  -- leave these issues for another time
>
>  main = do
>      ...
>      finalState <- execStateT game initialState
>      ...
>
>  game :: MyMonad ()
>  game = do
>      ...
>      addSpellForCharacter ...
>      liftIO $ putStrLn "Added spell ..."
>      ...

Dean
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090502/4cc143a3/attachment.htm


More information about the Haskell-Cafe mailing list