[Haskell-cafe] Tetris
Laurent Deniau
laurent.deniau at cern.ch
Tue Nov 20 12:07:21 EST 2007
Andrew Coppin wrote:
> 2. How do you implement a program that is fundamentally about state
mutation in a programming language which abhors state mutation?
Haskell taught me one thing (at least). The World is not mutating but it
is moving. Physics shows that no movement (no time) means no World (in
fact it means that you can't know if the World exists or not, which is
the same).
You can take the (discrete) analogy of a (time) *sequence* of pictures
which builds a movie. The pictures are immutable and so is the movie,
but looking quickly at the pictures makes the movie looking like a
mutable picture. Everything here is about (time) sequence, not mutability.
It is the same about Monad. Monad are not about side effects nor
mutability, but about sequencing. It uses the principle of causality
that one need to apply a function to its arguments before it returns a
result (and encapsulates this behavior in an object). Note that it says
nothing about lazy or eager evaluation, since the result can be either a
value or an (lazy) expression which evaluates to the value. What this
latter expression captures is the sequence of evaluation to perform to
get the value. Again, everything here is about sequence, not mutability.
Mutability is an (apparent) optimization. Creating a new state from the
previous state in the (time) sequence has a cost (note the functional
nature of this transition). Since a big part of this process can be
shared to reduce this cost, namely creating the storage / structure /
value / whatever of the state, one can think to reuse as much as
possible. In the movie analogy, this optimization is called mpeg
compression which only encodes the changes between images in the
sequence. The Haskell compiler can also do this kind of optimization as
soon as it doesn't change the observable behavior of the program. This
means that a Haskell program can have/deal with mutable states resulting
from an optimization. This mutability is explicit within the IO Monad
since it is the standard way to communicate with the computer World.
So the only (required) mutable states in the game are related to the IO,
not to the game states as one might think. But the encapsulation of
these states inside some monads may let the compiler do some
optimization for you.
my 2 cents of Euro.
a+, ld.
More information about the Haskell-Cafe
mailing list