Liste par compréhension et tableaux de données en Haskell

Voici un petit fichier pour s'habituer à travailler sur les listes par compréhension suivi de quelques indications:

Haskell
module Alien where
 
--   L I S T E S    P A R   C O M P R É H E N S I O N   
--    E T   T A B L E A U X   D E     D O N N É E S  
 
{-
    On vous demande de gérer le centre d'acceuil terrestre des aliens. 
    Vous disposez de 6 tableaux de données.
    Vous devez fournir les expressions qui permettent de répondre aux 
    questions posées au bas de cette page.
    Par exemple, pour avoir la liste des aliments :
    
    *Main> Data.List.nub ([m | Miam (a,m) <- baseMiam])
           ["Bortsch","Zoumise","Schwanstucke","Kashpir"]
    ce qui peut se lire : 
    " liste des m tels que Miam(a,m) soit dans baseMiam "
-}
 
import qualified Data.List as L
 
type NomA     = String
type Sexe     = String
type Planete  = String
type Aliment  = String
type NomE     = String
type Ville    = String
type NoCabine = Int
type NoAllee  = Int
 
 
data Alien       = Alien (NomA, Sexe, Planete, NoCabine)
data Cabine      = Cabine (NoCabine, NoAllee) 
data Miam        = Miam (NomA, Aliment)
data Agent       = Agent (NomE, Ville)
data Responsable = Responsable (NoAllee, NomE)
data Gardien     = Gardien (NomE, NoCabine)
            
 
baseAlien =  [
  Alien ( "Zorglub",    "M", "Trantor", 1 ),
  Alien ( "Blorx",      "M", "Euterpe", 2 ),
  Alien ( "Urxiz",      "F", "Aurora",  3 ),
  Alien ( "ZBleurdite", "F", "Trantor", 4 ),
  Alien ( "Darneurane","M", "Trantor", 5 ),
  Alien ( "Mulzo",      "M", "Helicon", 6 ),
  Alien ( "Zzzzz",      "F", "Aurora",  7 ),
  Alien ( "Arggh",      "M", "Nexon",   8 ),
  Alien ( "Joranum",    "F", "Euterpe", 9 )
  ]
            
baseCabine =  [
  Cabine ( 1 ,  1),
  Cabine ( 2 ,  1),
  Cabine ( 3 ,  1),
  Cabine ( 4 ,  1),
  Cabine ( 5 ,  1),
  Cabine ( 6 ,  2),
  Cabine ( 7 ,  2),
  Cabine ( 8 ,  2),
  Cabine ( 9 ,  2)
  ]
             
baseMiam =  [
  Miam ( "Zorglub",    "Bortsch"),
  Miam ( "Blorx",      "Bortsch"),
  Miam ( "Urxiz",      "Zoumise"),
  Miam ( "ZBleurdite", "Bortsch"),
  Miam ( "Darneurane", "Schwanstucke"),
  Miam ( "Mulzo",      "Kashpir"),
  Miam ( "Zzzzz",      "Kashpir"),
  Miam ( "Arggh",      "Zoumise"),
  Miam ( "Joranum",    "Bortsch")
  ]
           
baseAgent =  [ 
  Agent ( "Branno",   "Terminus"), 
  Agent ( "Darell",   "Terminus"), 
  Agent ( "Demerzel", "Reze"), 
  Agent ( "Seldon",   "Terminus"), 
  Agent ( "Dornick",  "Kalgan"), 
  Agent ( "Hardin",   "Terminus"), 
  Agent ( "Trevize",  "Hesperos"), 
  Agent ( "Pelorat",  "Kalgan"), 
  Agent ( "Riose",    "Terminus")
  ]
        
baseResponsable =  [
  Responsable ( 1, "Seldon"),
  Responsable ( 2, "Pelorat")
  ]
                  
 
baseGardien =  [
  Gardien ( "Branno",   1), 
  Gardien ( "Darell",   2), 
  Gardien ( "Demerzel", 3), 
  Gardien ( "Seldon",   4), 
  Gardien ( "Dornick",  5), 
  Gardien ( "Hardin",   6), 
  Gardien ( "Trevize",  7), 
  Gardien ( "Pelorat",  8), 
  Gardien ( "Riose",    9)
  ]
              
              
               
{-
Formez 
 
-1 la liste des gardiens ;
-2 la liste des villes où habitent les agents ;
-3 la liste des triplets (no de cabine,alien,gardien) pour chaque cabine ;
-4 la liste des couples (alien,allée) pour chaque alien ;
-5 la liste de tous les aliens de l'allée 2 ;
-6 la liste de toutes les planètes dont sont originaires les aliens habitant une cellule de numéro pair ;
-7 la liste des aliens dont les gardiens sont originaires de Terminus ;
-8 la liste des gardiens des aliens féminins qui mangent du bortsch ;
-9 la liste des cabines dont les gardiens sont originaires de Terminus ou dont les aliens sont des filles
 
 
Y a-t-il 
-10 des aliments qui commencent par la même lettre que le nom du gardien qui surveille l'alien qui les mange ? 
-11 des aliens originaires d'Euterpe ?
 
Est-ce que 
-12 tous les aliens ont un 'x' dans leur nom ?
-13 tous les aliens qui ont un 'x' dans leur nom ont un gardien qui vient de Terminus ?
-14 il existe un alien masculin originaire de Trantor qui mange du Bortsch ou dont le gardien vient de Terminus
-}
 
 
 
 
 
--Formez 
 
--1 la liste des gardiens ;
 
lesGardiens = [g | Gardien (g,c) <- baseGardien]
 
--2 la liste des villes où habitent les agents ;
 
lesVilles = L.nub [v | Agent (a,v) <- baseAgent]
 
--3 la liste des couples (alien,gardien) pour chaque cabine ;
 
lesAlienGarde = [(a,g) | Alien (a,s,p,c) <- baseAlien, Gardien (g,cc) <- baseGardien, cc == c ]
 
--4 la liste des couples (alien,allée) pour chaque alien ;
 
lesAlienAllee = [(a,aa) | Alien(a,s,p,c) <- baseAlien, Cabine(cc,aa) <- baseCabine, cc == c]
 
--5 la liste de tous les aliens de l'allée 2 ;
 
lesAlien2 = [a | Alien (a,s,p,c) <- baseAlien, Cabine (cc,aa) <- baseCabine, cc == c, aa == 2]
 
--6 la liste de toutes les planètes dont sont originaires les aliens habitant une cellule de numéro pair ;
 
lesPlanetePair = L.nub [p | Alien (n,s,p,c) <- baseAlien, mod c 2 == 0]
 
--7 la liste des aliens dont les gardiens sont originaires de Terminus ;
 
lesAlienTerminus = [n | 
                    Alien (n,s,p,c) <- baseAlien, 
                    Gardien (g,cc) <- baseGardien, 
                    Agent (gg,"Terminus") <- baseAgent,
                    c == cc,
                    g == gg
                    ]
 
--8 la liste des gardiens des aliens féminins qui mangent du bortsch ;
 
lesGardienFB = [g | 
                Gardien (g,c) <- baseGardien,
                Alien (n,"F",p,cc) <- baseAlien,
                Miam (nn,"Bortsch") <- baseMiam,
                c == cc,
                n == nn                
                  ]
 
--9 la liste des cabines dont les gardiens sont originaires de Terminus ou dont les aliens sont des filles
 
lesCabineGTouAF = [c |
                   Gardien (g,c) <- baseGardien,
                   Agent (gg,v) <- baseAgent,
                   Alien (n,s,p,cc) <- baseAlien,
                   g == gg,
                   c == cc,
                   (v == "Terminus") || (s == "F")
                  ]
 
--Y a--t--il 
--10 des aliments qui commencent par la même lettre que le nom du gardien qui surveille l'alien qui les mange ? 
 
lesAlimGard = [(a,g) | 
               Miam (n,a) <- baseMiam, 
               Alien (nn,s,p,c) <- baseAlien, 
               Gardien (g,cc) <- baseGardien, 
               n == nn, 
               c == cc
                     ]
              
testAG = any (\(a,g) -> head a == head g) lesAlimGard
 
--11 des aliens originaires d'Euterpe ?
 
testEu = any (\x -> x == "Euterpe") [p | Alien (n,s,p,c) <- baseAlien]
 
--Est--ce que 
--12 tous les aliens ont un 'x' dans leur nom ?
 
testX = all (\nom -> elem 'x' nom) [n | Alien (n,s,p,c) <- baseAlien]
 
--13 tous les aliens qui ont un 'x' dans leur nom ont un gardien qui vient de Terminus ?
 
testXT = all (\v -> v == "Terminus" ) [v | 
                                          Alien (n,s,p,c) <- baseAlien, 
                                          Gardien (g,cc) <- baseGardien,
                                          Agent (gg,v) <- baseAgent,
                                          c == cc,
                                          g == gg,
                                          elem 'x' n
                                            ]
            
--14 il existe un alien masculin originaire de Trantor qui mange du Bortsch ou dont le gardien vient de Terminus ?
 
lesAlienMTBouT = [n |
                   Gardien (g,c) <- baseGardien,
                   Agent (gg,v) <- baseAgent,
                   Alien (n,"M","Trantor",cc) <- baseAlien,
                   Miam (nn,m) <- baseMiam,
                   g == gg,
                   c == cc,
                   n == nn,
                   (v == "Terminus") || (m == "Bortsch")
                  ]
     
testMTBouT = lesAlienMTBouT == []
 
{-
λ> lesGardiens
["Branno","Darell","Demerzel","Seldon","Dornick","Hardin","Trevize","Pelorat","Riose"]
λ> lesVilles
["Terminus","Reze","Kalgan","Hesperos"]
λ> lesAlienGarde
[("Zorglub","Branno"),("Blorx","Darell"),("Urxiz","Demerzel"),("ZBleurdite","Seldon"),("Darneurane","Dornick"),("Mulzo","Hardin"),("Zzzzz","Trevize"),("Arggh","Pelorat"),("Joranum","Riose")]
λ> lesAlienAllee
[("Zorglub",1),("Blorx",1),("Urxiz",1),("ZBleurdite",1),("Darneurane",1),("Mulzo",2),("Zzzzz",2),("Arggh",2),("Joranum",2)]
λ> lesAlien2
["Mulzo","Zzzzz","Arggh","Joranum"]
λ> lesPlanetePair
["Euterpe","Trantor","Helicon","Nexon"]
λ> lesAlienTerminus
["Zorglub","Blorx","ZBleurdite","Mulzo","Joranum"]
λ> lesGardienFB
["Seldon","Riose"]
λ> lesCabineGTouAF
[1,2,3,4,6,7,9]
λ> lesAlimGard
[("Bortsch","Branno"),("Bortsch","Darell"),("Zoumise","Demerzel"),("Bortsch","Seldon"),("Schwanstucke","Dornick"),("Kashpir","Hardin"),("Kashpir","Trevize"),("Zoumise","Pelorat"),("Bortsch","Riose")]
λ> testAG
True
λ> testEu
True
λ> testX
False
λ> testXT
False
λ> lesAlienMTBouT
["Zorglub"]
λ> testMTBouT
False
λ> 
 -}