Le jeu de la vie en Haskell - partie 2
Je vais commencer par une amélioration du code du dernier article (merci @julienXX pour les indices).
La fonction createGeneration
était comme ceci:
Je l’ai transformé comme cela:
Elle utilise maintenant splitAt
, une fonction de base, qui simplifie la
transformation d’une liste en une liste de listes. J’ai aussi créé un type
Cell
, qui me semble utile à des fins de documentation.
Affichage d’une génération
Le sujet principal de cet article, c’est l’affichage d’une génération dans le terminal. Voici ma solution:
En avant pour les explications pas à pas. concat
concatène une liste de
string et show
transforme un élément en string.
> concat ["1", "0"]
"10"
> show 1
"1"
Je mappe la fonction show
sur chaque élément d’une liste de nombres.
> map show [1,0]
["1","0"]
Puis je peux les concaténer.
> concat (map show [1,0])
"10"
concatMap
est un raccourci pour concat (map ...)
.
> concatMap show [1,0]
"10"
On mappe le code précédent sur une génération complête.
> map (concatMap show) [[1,0], [0,0], [1,1]]
["10","00","11"]
Puis, grâce à intercalate
, on joint les éléments avec un saut de ligne.
> import Data.List
> intercalate "\n" (map (concatMap show) [[1,0], [0,0], [1,1]])
"10\n00\n11"
Pour ce qui est de replaceChar
, l’exemple suivant parle de lui-même.
> :load gol.hs
> map replaceChar "10\n00\n11"
"@ \n \n@@"
Voici le code actuel, n’hésitez pas à me faire part des améliorations possibles.
$ runhaskell gol.hs
@@@ @ @ @@@ @@@@@@ @ @ @ @ @ @ @ @@@@ @ @@ @ @@@@ @ @ @@@ @@ @ @
@ @ @@ @@@ @@@@ @@ @@@@ @ @@@ @@ @ @ @@ @ @ @@@ @ @@@ @@@ @ @
@ @@@ @@ @ @@ @@ @ @@@ @@ @ @ @@ @@ @@@ @@@@@@ @@ @@@@ @@ @
[...]