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' objects
maFonction : 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 String
quantite : 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)) c
addition : Int -> Int -> Int
nomUtilisateur : User -> String
modifiePrenom : Prenom -> User -> User
type 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 data
par 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 -> False
type 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 } -- Erreur
type alias User =
{ motDePasse : MotDePasse
}
type MotDePasse
= MotDePasse String
modifieMotDePasse : MotDePasse -> User -> User
modifieMotDePasse motDePasse user =
{ user | motDePasse = motDePasse }
utilisateurAvecMotDePasse =
modifieMotDePasse (MotDePasse "a") utilisateur
module 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 -> Bool
import 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 -> DemandeDeSuppression
Jeroen Engels (Yeuroune)
jfmengels sur le Slack Elm