Le XXIème siècle sera typé ou ne sera pas

ou Comment j’ai appris à aimer les types

Arnaud Bailly - @dr_c0d3

2019-09-24

Plan

  • Introduction
  • Motivation
  • Explication
  • Conclusion

Introduction

Pourquoi ?

  • Discussions sur le canal #beginners dans le slack elm-lang: Beaucoup du questions sur le type de List a
  • Making Impossible States Impossible
  • Lien entre types et formalisation de domaines métiers

Objectif

  • Faire découvrir la richesse des systèmes de types des langages fonctionnels
  • Comprendre comment utiliser ces systèmes pour des programmes “normaux”
  • Comprendre en quoi un système de types riche peut permettre de mieux concevoir des programmes

Motivation

Explication

Fonctions pures

Fonctions pures

selectEntries : (Account -> Bool) -> Vect k Entries -> Balance

isLeapYear : Year -> Bool

toDate : String -> String -> String -> Either String Date

Types de données algébriques

Types de données algébriques

data Balance : Type where
  Zero : Balance

  Bal : (n : Amount) -> (d : Direction) -> Balance

Types de données algébriques récursifs

data List a = Nil | Cons a (List a)

Interfaces

Interfaces

interface ToSExp a where
  toSExp : a -> SExp

ToSExp SExp where
  toSExp = id

ToSExp Unit where
  toSExp () = SList []

Familles de types


type family Answer q = a | a -> q where
  Answer QCM          = Int
  Answer Grade        = Double
  Answer OpenQuestion = Text
Factors : UnitType -> Type
Factors Armored       = StdFactors
Factors Artillery     = Arty
Factors AntiTank      = Pak
Factors HQ            = Arty
Factors SupplyColumn  = Unit

Types existentiels

Types existentiels

data CmdREPL : (segment : GameSegment) -> Type where
  Cmd : (cmd : Command segment) -> CmdREPL segment
  Qry : (ToSExp res) => (qry : Query res) -> CmdREPL segment
data BookOfAccounts : Type where
  BookTransactions : (txs : Vect k Transaction) ->
                     BookOfAccounts

GADTs

GADTs

data Query : (result : Type) -> Type where
  SupplyPath : (unitName : String)
             -> Query (Either QueryError (List Pos))

  TerrainMap : Query Map

Hole-Driven Development

Hole-Driven Development

Eq Balance where
  (==) b b' = ?hole
- + Accounting.Core.hole [P]
 `--                     b : Balance
                        b' : Balance
     --------------
      Accounting.Core.hole : Bool

Types dépendants

Types dépendants

record GameUnit where
  constructor MkGameUnit
  nation : Nation
  unitType : UnitType
  name : String
  move : Nat
  hit : Bool
  combat : Factors unitType

Type égalité

Type égalité

neighbours1_test : (neighbours (Hex 3 3) = [ Hex 2 3, Hex 3 2
                                           , Hex 4 3, Hex 4 4
                                           , Hex 3 4, Hex 2 4] )
neighbours1_test = Refl

Type égalité

data Entries : Type where
  MkEntries : (entries : Vect n Entry) ->
              { auto need2Entries : LTE 2 n } ->
              { auto balanced : balance entries = Zero } -> Entries

Types = Proposition

Types = Proposition

notPosZIsNotAbsZ : ((y = Pos 0) -> Void) -> ((absZ y = 0) -> Void)
notPosZIsNotAbsZ = contrapositive absZIsPosZ

Types = Proposition

contrapositive : (a -> b) -> (Not b -> Not a)
contrapositive = flip (.)

Types = Proposition

absZIsPosZ : (absZ y = 0) -> (y = Pos 0)
absZIsPosZ {y = (Pos Z)}     Refl = Refl
absZIsPosZ {y = (Pos (S _))} Refl impossible
absZIsPosZ {y = (NegS _)}    Refl impossible

Conclusion

Conclusion

  • Le système de type est un outil essentiel dans la conception du logiciel
  • Les systèmes de types fonctionnels sont de plus en plus sophistiqués et permettent de modéliser des contraintes de plus en plus proches du métier
  • Le XXIème sera typé !

Pub

  • 2 jours de formation gratuite sur l’Architecture Fonctionnelle
  • S’approprier les fondamentaux de l’architecture fonctionnelle et apprendre à les mettre en pratique dans la conception d’un logiciel.
  • Paris (lieu exact TBD), les 14 et 15 novembre 2019
  • Un partenariat Aleryo / Palo-IT
  • Contact: arnaud@aleryo.com

Colophon

(Quelques) Références

(Quelques) Références

Credits

Credits

Feedback

Questionnaire

https://forms.gle/C1h63ymmoqdceeme7