$30 off During Our Annual Pro Sale. View Details »

Finding the Algebra in Algebraic Data Types

Finding the Algebra in Algebraic Data Types

Construction of an algebra using Swift's type system.

Johannes Weiss

October 19, 2015
Tweet

More Decks by Johannes Weiss

Other Decks in Technology

Transcript

  1. FINDING THE
    ALGEBRA IN
    ALGEBRAIC DATA
    TYPES

    View Slide

  2. ALGEBRA?
    Algebra (from Arabic and Farsi "al-jabr" meaning "reunion
    of broken parts") is one of the broad parts of
    mathematics, together with number theory, geometry and
    analysis. In its most general form, algebra is the study of
    mathematical symbols and the rules for manipulating
    these symbols.
    — Wikipedia

    View Slide

  3. !

    View Slide

  4. DON'T WORRY !
    One algebra you know from primary school
    > Symbols/Elements: !, ", #, $, ...
    > Manipulation/Operators: ➕➖✖➗

    View Slide

  5. FANCIER SYMBOLS
    > , ,
    AND RULES
    >
    >

    View Slide

  6. THE ALGEBRA
    OF SWIFT TYPES

    View Slide

  7. THE ALGEBRA OF SWIFT TYPES
    > Example elements: Int, Bool, ...
    > Example operator: Optional

    View Slide

  8. COUNTING THE VALUES
    > Bool : [false, true]
    > UInt : 0, 1, 2 ...

    View Slide

  9. GOT !?

    View Slide

  10. ()
    > ()
    > Bool
    typealias One = () /* = Void */
    typealias Two = Bool
    let theOne : [One] = [()]
    let allTwos : [Two] = [false, true]

    View Slide

  11. NEED ! !

    View Slide

  12. enum Zero {}

    View Slide

  13. !"
    enum Zero {
    }
    let impossible : Zero = ! /* has no value */
    let possibles : [Zero] = []

    View Slide

  14. ADDITION
    enum Add {
    case AddL(L)
    case AddR(R)
    }
    typealias Three = Add /* Add<(), Bool> */
    let allThrees : [Three] = [ .AddL(()),
    .AddR(false),
    .AddR(true)]

    View Slide

  15. typealias Five = Add
    let fs : [Five] = [.AddL(.AddL(())),
    .AddL(.AddR(false)),
    .AddL(.AddR(true)),
    .AddR(false),
    .AddR(true)]

    View Slide

  16. OPTIONALS
    enum Optional {
    case None
    case Some(T)
    }
    Optional

    View Slide

  17. MULTIPLICATION
    struct Mul {
    let l : L
    let r : R
    }
    /* alternative: (L, R) */
    typealias Four = Mul
    let fours : [Four] = [Mul(l:false, r:false),
    Mul(l:false, r:true),
    Mul(l:true, r:false),
    Mul(l:true, r:true)]

    View Slide

  18. THE RULES
    typealias Two_ = Add
    let allTwo_s : [Two_] = [.AllL(false), .AddL(true)]

    View Slide

  19. typealias ThreeL = Add
    typealias ThreeR = Add
    let l : [ThreeL] = [.AddL(()), .AddR(false), .AddR(true)]
    let r : [ThreeR] = [.AddL(false), .AddL(true), .AddR(())]

    View Slide

  20. typealias Two__ = Mul
    let all2__ : [Two__] = [Mul(l:(), r:false),
    Mul(l:(), r:true)]

    View Slide

  21. typealias Zero_ = Mul
    let allZero_ : [Zero_] = []
    // Mul(l:.AddL(()), r:!)

    View Slide

  22. DISTRIBUTIVE LAW :)
    Mul> === Add, Mul>

    View Slide

  23. WHAT ABOUT
    FUNCTION TYPES?

    View Slide

  24. FUNCTION TYPES
    enum Colour { case White; case Red }
    enum Fill { case None; case Pattern; case Solid }
    func myFavouriteFillForColour(colour : Colour) -> Fill {
    switch (colour) {
    case .White:
    return .Solid
    case .Red:
    return .Pattern
    }
    }
    How many functions myFavouriteFillForColour?

    View Slide

  25. COUNTING (Colour) -> Fill

    View Slide

  26. FUNCTION TYPES
    > Colour , Fill
    > (Colour) -> Fill
    turns out:
    > (A) -> B
    !

    View Slide

  27. (A, B) -> C ❓

    View Slide

  28. > (A, B) -> C
    > (A) -> (B -> C)
    > currying ✅
    func isNiceTuple(colour : Colour, fill : Fill) -> Bool {
    return true
    }
    func isNiceCurried(colour : Colour)(fill : Fill) -> Bool {
    return true
    }

    View Slide

  29. THANK YOU
    QUESTIONS?
    @JOHANNESWEISS

    View Slide