[Haskell-cafe] some help on do and preservingMatrix
Jason Dusek
jason.dusek at gmail.com
Thu Nov 26 15:13:47 EST 2009
2009/11/26 Zsolt Ero <zsolt.ero at gmail.com>:
> My very basic question is that how do I generally repeat a command
> many times? I understand "do" can do it, but it's not clear to me how
> to use it and how it works.
>
> So if I would like to write the following in one line, how could I write it?:
> spiral 0.7
> spiral 0.8
> spiral 0.9
> spiral 1.0
>
> I don't understand in which cases I can use "map something
> [0.7,0.8..1]" and in which cases I need do and how could I map using
> do.
Say we have something to draw a spiral:
spiral :: (Floating f) => f -> IO ()
So `spiral` takes a floating point number and gives us a
program in the IO monad that returns `()`.
We wish to draw several spirals. Here's one way:
draw_them_all = do
spiral 0.7
spiral 0.8
spiral 0.9
spiral 1.0
Here's another way:
another_way = do
sequence_ several_spirals
where
several_spirals :: [IO ()]
several_spirals = map spiral [0.7,0.8,0.9,1.0]
Or even:
another_way' = sequence_ several_spirals
where
several_spirals :: [IO ()]
several_spirals = map spiral [0.7,0.8,0.9,1.0]
The `do` is helpful to compose several monadic values (in this
case, programs in the IO monad). If you have a list of monadic
values you can use `sequence_` to join them together into one
monadic value. So you use `map` to build your programs and
then `sequence_` to join them together in order.
> From the tutorial, I could write this line, which works, but I
> don't really know what does mapM_ and preservingMatrix do.
The function `mapM_` is simply the composition of `sequence_`
and `map`.
mapM_ f list = sequence_ (map f list)
As for `preserveMatrix`, it is some OpenGL thing; probably
what it does is ensure that any changes you make to one of the
matrices that make up the rendering state are undone once you
exit the enclosed computation.
--
Jason Dusek
More information about the Haskell-Cafe
mailing list