<!doctype html public "-//W3C//DTD W3 HTML//EN">
<html><head><style type="text/css"><!--
blockquote, dl, ul, ol, li { padding-top: 0 ; padding-bottom: 0 }
 --></style><title>Re: [Haskell-cafe] using haskell for a
project</title></head><body>
<div>At 7:17 PM +0200 5/2/09, Nicolas Martyanoff wrote:</div>
<blockquote type="cite" cite>Content-Type: multipart/signed;
micalg=pgp-sha1;<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>protocol=&quot;application/pgp-signature&quot;;
boundary=&quot;ibTvN161/egqYuK8&quot;<br>
Content-Disposition: inline<br>
<br>
Hi,<br>
<br>
I don't think I already presented myself; I'm Nicolas, a 23y
french<br>
student, trying to learn and use haskell.<br>
<br>
I've been using C for years, for all sort of tasks, and am quite<br>
comfortable with it. I'm also using it 40h a week in my internship
for<br>
network systems, so I kind of know how to use it.<br>
<br>
I discovered Haskell some monthes ago, bought `Real World
Haskell',<br>
quickly read, and enjoyed it.<br>
<br>
So now I'd want to use it for a small project of mine, a simple<br>
multiplayer roguelike based on telnet. I wrote a minimal server in C,
and<br>
it took me a few hours. Now I'm thinking about doing the same in
Haskell,<br>
and I'm in trouble.<br>
<br>
I don't really know how to map my ideas in haskell code. For example,
a<br>
character can cast spells, so I'd have something like this in C:<br>
<br>
&nbsp;&nbsp;&nbsp; struct hashtable spells;<br>
<br>
&nbsp;&nbsp;&nbsp; struct character {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n_spells;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct spell **spells;<br>
&nbsp;&nbsp;&nbsp; };<br>
<br>
I thought I could do something like this in haskell:<br>
<br>
&nbsp;&nbsp;&nbsp; spells = Data.Map.Map Int Spell<br>
<br>
&nbsp;&nbsp;&nbsp; data Character = Character { charSpells :: [Int]
}<br>
<br>
But now I don't know how to dynamically add new spells (new spells can
be<br>
created in my gameplay). Since I can't assign a new value to the
`spells'<br>
variable (Data.Map.insert returns a new map), I just don't know where
to<br>
go.<br>
<br>
I have the same problem for a bout every problem. I love writing
pure<br>
functions in haskell, but as soon as I try to write some code
involving<br>
states or side effects, I can't write a line.<br>
<br>
I just wanted a 2d array to store a zone, for example, dead simple in
C,<br>
but this kind of link<br>
http://greenokapi.net/blog/2009/03/10/rough-grids-in-haskell make
me<br>
shiver.<br>
<br>
Point is, I'd like to use haskell, but I don't know how, it seems
totally<br>
alien.<br>
<br>
How did you manage to change the way you map ideas to code, from<br>
imperative to pure functional ?<br>
<br>
Thank you.<br>
<br>
Regards,<br>
<br>
--</blockquote>
<blockquote type="cite" cite>Nicolas Martyanoff<br>
&nbsp;&nbsp; http://codemore.org</blockquote>
<blockquote type="cite" cite>&nbsp;&nbsp;
khaelin@gmail.com</blockquote>
<div><br></div>
<div>Nicolas,</div>
<div><br></div>
<div>First, bienvenue  Haskell !&nbsp; Learning it will stretch
your mind; it may be rocky at times, but it will be rewarding.</div>
<div><br></div>
<div>You've quickly come upon a key difference between imperative and
functional programming.&nbsp; State management in Haskell is more
explicit, which is a double-edged sword.&nbsp; It requires greater
discipline and mechanism, but provides greater control and
security.</div>
<div><br></div>
<div>In your example program you could manage your state with a State
monad.&nbsp; Assuming you'll want to be able to do I/O, you'll
probably want to combine State with IO.&nbsp; For starters, something
like:</div>
<div><br></div>
<div><font face="Courier">&gt; import Control.Monad.State</font></div>
<div><font face="Courier">&gt; import qualified Data.Map as
M</font></div>
<div><font face="Courier">&gt;</font></div>
<div><font face="Courier">&gt; data Spell = ...</font></div>
<div><font face="Courier">&gt; data Character = Character { charName
:: String, charSpells :: [Spell], ... }</font></div>
<div><font face="Courier">&gt; data MyState = MyState { characters ::
M.Map String Character, ... }</font></div>
<div><font face="Courier">&gt; initialState = MyState { characters =
M.empty, ... }</font></div>
<div><font face="Courier">&gt;</font></div>
<div><font face="Courier">&gt; type MyMonad = StateT MyState
IO</font></div>
<div><font face="Courier">&gt;</font></div>
<div><font face="Courier">&gt; addSpellForCharacter :: String -&gt;
Spell -&gt; MyMonad ()</font></div>
<div><font face="Courier">&gt; addSpellForCharacter name spell =
do</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp; state &lt;-
get</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp; let chars =
characters state</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp; case M.lookup
name chars of</font></div>
<div><font
face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Just char -&gt; let char' = char { charSpells = spell : charSpells
char }</font></div>
<div><font
face="Courier"
>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
></span
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
></span>&nbsp;&nbsp;&nbsp;&nbsp; state' = state { characters =
M.insert name char' chars }</font></div>
<div><font
face="Courier"
>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span
></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
in put state'</font></div>
<div><font
face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Nothing&nbsp;&nbsp; -&gt; ...&nbsp; -- leave these issues for another
time</font></div>
<div><font face="Courier">&gt;</font></div>
<div><font face="Courier">&gt; main = do</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp;
...</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp; finalState
&lt;- execStateT game initialState</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp;
...</font></div>
<div><font face="Courier">&gt;</font></div>
<div><font face="Courier">&gt; game :: MyMonad ()</font></div>
<div><font face="Courier">&gt; game = do</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp;
...</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp;
addSpellForCharacter ...</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp; liftIO $
putStrLn &quot;Added spell ...&quot;</font></div>
<div><font face="Courier">&gt;&nbsp;&nbsp;&nbsp;&nbsp;
...</font></div>
<div><br></div>
<div>Dean</div>
</body>
</html>