Jeroen Engels (Yeuroune)
Jeroen Engels (Yeuroune)
age : Int
age = 30
nom : String
nom = "Jeroen Engels"Dynamique : Vérification au cours de l'exécution (JavaScript, Python, Clojure, ...)
# Python
>>> "string" + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objectsmaFonction : TypeParametre1 -> TypeParametre2 -> TypeDeRetour
maFonction parametre1 parametre2 =
    valeurDeLaFonction
variable : Type
variable =
  maFonction argument1 argument2
type alias Prenom = String
type alias Nom =
  { prenom : Prenom
  , age : Int
  }
type Sexe
  = Homme
  | Femme
  | Autre Stringquantite : Int
quantite = "100" -- NON!prenom : String -- Garanti par le compilateur
prenom =
  "Jeroen"
  
-- Si jamais on change
prenom : String
prenom =
  1000 -- Erreur de compilation
  
a : (Nom -> Nom) -> User -> User
a b c =
  d (b (e c)) caddition : Int -> Int -> Int
nomUtilisateur : User -> String
modifiePrenom : Prenom -> User -> Usertype alias RequeteAuServeur data =
  { enCours : Bool
  , enErreur : Bool
  , données : Maybe data
  }maRequete : RequeteAuServeur String
maRequete =
  { enCours = True
  , enErreur = True
  , données = Just "Jeroen"
  }type RequeteAuServeur data
  = NonDemarree
  | EnCours
  | EnErreur
  | EnSucces datapar Richard Feldman
type alias User =
  { nom : String
  -- "admin" ou "user"
  , role : String
  }
peutSupprimerBaseDeDonnees : User -> Bool
peutSupprimerBaseDeDonnees user =
    if user.role == "user" then
        False
    else
        True
user : User
user =
  { nom = "Jeroen Engels"
  , role = "User"
  }type alias User =
  { nom : String
  , role : Role
  }
type Role
  = Admin
  | User
peutSupprimerBaseDeDonnees : User -> Bool
peutSupprimerBaseDeDonnees user =
    case user.role of
    	Admin -> True
    	User -> Falsetype alias User =
  { login : String
  , motDePasse : String
  }
modifieMotDePasse : String -> User -> User
modifieMotDePasse motDePasse user =
  { user | login = motDePasse }
type alias User =
  { login : Login
  , motDePasse : MotDePasse
  }
type Login
  = Login String
type MotDePasse
  = MotDePasse String
modifieMotDePasse : MotDePasse -> User -> User
modifieMotDePasse motDePasse user =
  { user | login = motDePasse } -- Erreurtype alias User =
  { motDePasse : MotDePasse
  }
type MotDePasse
  = MotDePasse String
modifieMotDePasse : MotDePasse -> User -> User
modifieMotDePasse motDePasse user =
  { user | motDePasse = motDePasse }
utilisateurAvecMotDePasse =
  modifieMotDePasse (MotDePasse "a") utilisateurmodule MotDePasse exposing
  (MotDePasse, fromString, comparer)
-- Ne pas faire MotDePasse(..)
type MotDePasse
  = MotDePasse String
  
{-| Si mdp est fort, alors retourne Just mdp, sinon Nothing -}
fromString : String -> Maybe MotDePasse
comparer : String -> MotDePasse -> Boolimport MotDePasse exposing (MotDePasse)
modifieMotDePasse : MotDePasse -> User -> User
modifieMotDePasse motDePasse user =
  { user | motDePasse = motDePasse }
utilisateurAvecMotDePasse =
  case MotDePasse.fromString "a" of
    Just mdp -> 
      modifieMotDePasse mdp utilisateur
    Nothing -> 
      utilisateur-- Rendre Preuve opaque
type Preuve = Preuve
type Role
  = Admin Preuve
  | User
supprimerBaseDeDonnees : Preuve -> DemandeDeSuppressionJeroen Engels (Yeuroune)
jfmengels sur le Slack Elm