Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Speaking in Types

TJ Usiyan
October 16, 2015

Speaking in Types

Slides for 2015 October 16 talk at CocoaConf

TJ Usiyan

October 16, 2015
Tweet

More Decks by TJ Usiyan

Other Decks in Programming

Transcript

  1. Speaking in Types How I Learned to Stop Worrying and

    Love the Type System TJ Usiyan - @griotspeak © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 1
  2. How can we examine types? © Speaking in Types -

    CocoaConf San Jose - @griotspeak, 2015 2
  3. Examining Types in Xcode • Option click • Look at

    declarations • Look at the generated header © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 3
  4. What is a Type? © Speaking in Types - CocoaConf

    San Jose - @griotspeak, 2015 4
  5. What is a Type? The description of a portion of

    our system's domain. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 5
  6. What is a Type? Types are how we describe the

    data that our system works with. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 6
  7. In Objective-C, Compiler puts trust in you. In Swift, you

    put trust in compiler — Yakko Smirnoff I'm Sorry Dave. I'm Afraid I can't do that. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 7
  8. NSError NSError *error = nil; [myContext save:&error]; if (!error) {

    /* "Woohoo" */ } else { /* "Oh noes!" */ } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 9
  9. NSError Redux NSError *error = nil; BOOL success = [myContext

    save:&error]; if (success) { /* "Woohoo" */ } else { /* "Oh noes!" */ } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 10
  10. NSError Re-Redux do { try/*(?|!)?*/ myContext.save() } catch { }

    © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 11
  11. Result enum Result<T> { case Error(NSError) case Success(T) } ©

    Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 12
  12. "An Either by any other name would compile as sweet."

    — Gilliam Shakespeare enum Either<T, U> { case Left(T) case Right(U) } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 13
  13. Make Illegal States Unrepresentable — Yaron Minsky let contactInfo:(PhoneNumber?, EmailAddress?)

    © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 15
  14. Enums Are Delightful. enum FileLoadingResult { case Success(NSData) case LoadError(NSError)

    } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 19
  15. Enums Are Delightful. enum Foo {} © Speaking in Types

    - CocoaConf San Jose - @griotspeak, 2015 20
  16. Enums Are Delightful. enum MyNamespace {} © Speaking in Types

    - CocoaConf San Jose - @griotspeak, 2015 21
  17. Optionals Are Quite Nice as Well. typedef NS_ENUM(NSInteger, YouCanGetWith) {

    YouCanGetWithNull = 0, YouCanGetWithThis, YouCanGetWithThat}; © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 23
  18. Optionals Are Quite Nice as Well. typedef NS_ENUM(NSInteger, YouCanGetWith) {

    YouCanGetWithNull = 0, YouCanGetWithThis, YouCanGetWithThat}; vs enum YouCanGetWith { case This, That } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 24
  19. Putting the 'Algebra' in Algebraic Data Types © Speaking in

    Types - CocoaConf San Jose - @griotspeak, 2015 26
  20. Algebra of Data Types - Zero Type Void /// The

    empty tuple type. /// /// This is the default return type of /// functions for which no explicit /// return type is specified. typealias Void = () © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 27
  21. Algebra of Data Types - Sum Types Enums enum PrimaryColor

    { case Red, Blue, Yellow } enum Either<T, U> { case Left(T) case Right(U) } let foo:Either<Bool, PrimaryColor> // 2(Bool) + 3(PrimaryColor) possible values © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 28
  22. Algebra of Data Types - Product Types Tuples let bar:(Bool,

    PrimaryColor) // 2(Bool) * 3(PrimaryColor) possible values © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 29
  23. Functions Types Need Love Too. — Samantha Wolf © Speaking

    in Types - CocoaConf San Jose - @griotspeak, 2015 31
  24. Functions are Maps! func myRandom() -> Int func consumeNumber(Int) //

    (Int) -> () func sortNums([Int]) -> [Int] © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 32
  25. Function Types func find<C : CollectionType where C.Generator.Element : Equatable>

    (domain: C, value: C.Generator.Element) -> [C.Generator.Element] vs func find<C : CollectionType where C.Generator.Element : Equatable> (domain: C, value: C.Generator.Element) -> C.Index? vs func find<C : CollectionType where C.Generator.Element : Equatable> (domain: C, value: C.Generator.Element) -> C.Generator.Element © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 33
  26. Optional Initializers …when illegal state is completely worth it struct

    ScaleDegree { init(diatonicValue:DiatonicValue, chromaticValue:ChromaticValue) init(accidental:Accidental, diatonicValue:DiatonicValue) init?(quality:Interval.Quality, diatonic:DiatonicValue) } let scaleDegree = ScaleDegree(.Perfect, .Fifth)! © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 35
  27. Parametric Polymorphism struct Array<T> class Thing<T> func foo<T> protocol BazableType

    { typealias T } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 37
  28. Parametric Polymorphism • Structs • Enums • Classes • Prototypes

    • Structs • Classes © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 38
  29. Trait Polymorphism • Structs • Enums • Classes • Functions

    © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 40
  30. Generic Function Signatures <T>(T) -> () © Speaking in Types

    - CocoaConf San Jose - @griotspeak, 2015 42
  31. Generic Function Signatures <T>([T]) -> [T] © Speaking in Types

    - CocoaConf San Jose - @griotspeak, 2015 43
  32. Generic Function Signatures <T: Comparable>([T]) -> [T] © Speaking in

    Types - CocoaConf San Jose - @griotspeak, 2015 44
  33. Generic Function Signatures <T, U>(T) -> U © Speaking in

    Types - CocoaConf San Jose - @griotspeak, 2015 45
  34. Generic Function Signatures <T>(T, T) -> T © Speaking in

    Types - CocoaConf San Jose - @griotspeak, 2015 46
  35. Generic Function Signatures <T,U,V>((U -> V), (T -> U)) ->

    (T -> V) © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 47
  36. Names Are Part of a Type func stride<T : Strideable>(from

    start: T, to end: T, by stride: T.Stride) -> StrideTo<T> func stride<T : Strideable>(from start: T, through end: T, by stride: T.Stride) -> StrideThrough<T> © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 48
  37. Names Are Part of a Type … start: T, to

    end: … … start: T, through end: … © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 49
  38. Function Overloading +(T, T) -> T © Speaking in Types

    - CocoaConf San Jose - @griotspeak, 2015 51
  39. Function Overloading func +(lhs: Float, rhs: Float) -> Float func

    +<T>(lhs: Int, rhs: UnsafePointer<T>) -> UnsafePointer<T> func +<T>(lhs: UnsafePointer<T>, rhs: Int) -> UnsafePointer<T> func +(lhs: Int, rhs: Int) -> Int func +(lhs: UInt, rhs: UInt) -> UInt func +(lhs: Int64, rhs: Int64) -> Int64 func +(lhs: UInt64, rhs: UInt64) -> UInt64 func +<T>(lhs: Int, rhs: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T> func +<T>(lhs: UnsafeMutablePointer<T>, rhs: Int) -> UnsafeMutablePointer<T> func +(lhs: Int32, rhs: Int32) -> Int32 func +(lhs: UInt32, rhs: UInt32) -> UInt32 func +(lhs: Int16, rhs: Int16) -> Int16 func +(lhs: UInt16, rhs: UInt16) -> UInt16 func +(lhs: Int8, rhs: Int8) -> Int8 func +(lhs: UInt8, rhs: UInt8) -> UInt8 func +(lhs: Double, rhs: Double) -> Double func +(lhs: String, rhs: String) -> String // `SummableType` anyone? © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 52
  40. Higher Kinded Types func ==<T : Equatable>(lhs: T?, rhs: T?)

    -> Bool /// Returns true if these arrays contain the same elements. func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool /// Returns true if these arrays contain the same elements. func ==<T : Equatable>(lhs: Slice<T>, rhs: Slice<T>) -> Bool /// Returns true if these arrays contain the same elements. func ==<T : Equatable>(lhs: ContiguousArray<T>, rhs: ContiguousArray<T>) -> Bool © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 54
  41. Higher Kinded Types How can we state that a container

    holding an Equatable type is Equatable? © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 55
  42. Higher Kinded Types How can we state that a container

    holding an Equatable type is Equatable? © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 56
  43. Higher Kinded Types We must repeat ourselves. This fact is

    unfortunate. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 57
  44. Higher Kinded Types - Map, Filter, and Friends /// Return

    an `Array` containing the results of mapping `transform` /// over `source`. func map<S : SequenceType, T>(source: S, transform: (S.Generator.Element) -> T) -> [T] /// Return an `Array` containing the results of mapping `transform` /// over `source`. func map<C : CollectionType, T>(source: C, transform: (C.Generator.Element) -> T) -> [T] © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 58
  45. • The type system is our friend • Types can

    hold more meaning than in Obj-C. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 59
  46. Sources • Effective ML 1 • Algebra of Data Types

    [^2] 1 https://vimeo.com/14313378 [^2]:http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of-algebraic-data-types/ © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 60