Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Speaking in Types
Search
TJ Usiyan
October 16, 2015
Programming
35
0
Share
Speaking in Types
Slides for 2015 October 16 talk at CocoaConf
TJ Usiyan
October 16, 2015
More Decks by TJ Usiyan
See All by TJ Usiyan
Musical Phantoms
griotspeak
0
83
Property-Based Testing with SwiftCheck
griotspeak
1
5.5k
Other Decks in Programming
See All in Programming
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
330
AIエージェントで業務改善してみた
taku271
0
510
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
150
Going Multiplatform with Your Android App (Android Makers 2026)
zsmb
2
390
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
6.3k
事業会社でのセキュリティ長期インターンについて
masachikaura
0
250
ドメインイベントでビジネスロジックを解きほぐす #phpcon_odawara
kajitack
2
140
「速くなった気がする」をデータで疑う
senleaf24
0
170
Feature Toggle は捨てやすく使おう
gennei
0
570
CDK Deployのための ”反響定位”
watany
4
700
AWS re:Invent 2025の少し振り返り + DevOps AgentとBacklogを連携させてみた
satoshi256kbyte
3
160
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
kentaroutakeda
5
2.5k
Featured
See All Featured
Tell your own story through comics
letsgokoyo
1
890
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
170
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
330
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
160
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.5k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
340
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
160
Building Flexible Design Systems
yeseniaperezcruz
330
40k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
210
HDC tutorial
michielstock
2
620
Transcript
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
How can we examine types? © Speaking in Types -
CocoaConf San Jose - @griotspeak, 2015 2
Examining Types in Xcode • Option click • Look at
declarations • Look at the generated header © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 3
What is a Type? © Speaking in Types - CocoaConf
San Jose - @griotspeak, 2015 4
What is a Type? The description of a portion of
our system's domain. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 5
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
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
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 8
NSError NSError *error = nil; [myContext save:&error]; if (!error) {
/* "Woohoo" */ } else { /* "Oh noes!" */ } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 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
NSError Re-Redux do { try/*(?|!)?*/ myContext.save() } catch { }
© Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 11
Result enum Result<T> { case Error(NSError) case Success(T) } ©
Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 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
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 14
Make Illegal States Unrepresentable — Yaron Minsky let contactInfo:(PhoneNumber?, EmailAddress?)
© Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 15
enum ContactInfo { case Phone(PhoneNumber) case Email(EmailAddress) case PhoneAndEmail(PhoneNumber, EmailAddress)
} © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 16
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 17
On Semantics Demo © Speaking in Types - CocoaConf San
Jose - @griotspeak, 2015 18
Enums Are Delightful. enum FileLoadingResult { case Success(NSData) case LoadError(NSError)
} © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 19
Enums Are Delightful. enum Foo {} © Speaking in Types
- CocoaConf San Jose - @griotspeak, 2015 20
Enums Are Delightful. enum MyNamespace {} © Speaking in Types
- CocoaConf San Jose - @griotspeak, 2015 21
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 22
Optionals Are Quite Nice as Well. typedef NS_ENUM(NSInteger, YouCanGetWith) {
YouCanGetWithNull = 0, YouCanGetWithThis, YouCanGetWithThat}; © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 23
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
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 25
Putting the 'Algebra' in Algebraic Data Types © Speaking in
Types - CocoaConf San Jose - @griotspeak, 2015 26
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
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
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
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 30
Functions Types Need Love Too. — Samantha Wolf © Speaking
in Types - CocoaConf San Jose - @griotspeak, 2015 31
Functions are Maps! func myRandom() -> Int func consumeNumber(Int) //
(Int) -> () func sortNums([Int]) -> [Int] © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 32
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
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 34
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
Polymorphism! © Speaking in Types - CocoaConf San Jose -
@griotspeak, 2015 36
Parametric Polymorphism struct Array<T> class Thing<T> func foo<T> protocol BazableType
{ typealias T } © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 37
Parametric Polymorphism • Structs • Enums • Classes • Prototypes
• Structs • Classes © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 38
Trait Polymorphism struct Array<T:Equatable> class Thing<T:Equatable> func foo<T:Equatable> © Speaking
in Types - CocoaConf San Jose - @griotspeak, 2015 39
Trait Polymorphism • Structs • Enums • Classes • Functions
© Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 40
© Speaking in Types - CocoaConf San Jose - @griotspeak,
2015 41
Generic Function Signatures <T>(T) -> () © Speaking in Types
- CocoaConf San Jose - @griotspeak, 2015 42
Generic Function Signatures <T>([T]) -> [T] © Speaking in Types
- CocoaConf San Jose - @griotspeak, 2015 43
Generic Function Signatures <T: Comparable>([T]) -> [T] © Speaking in
Types - CocoaConf San Jose - @griotspeak, 2015 44
Generic Function Signatures <T, U>(T) -> U © Speaking in
Types - CocoaConf San Jose - @griotspeak, 2015 45
Generic Function Signatures <T>(T, T) -> T © Speaking in
Types - CocoaConf San Jose - @griotspeak, 2015 46
Generic Function Signatures <T,U,V>((U -> V), (T -> U)) ->
(T -> V) © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 47
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
Names Are Part of a Type … start: T, to
end: … … start: T, through end: … © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 49
Function Overloading © Speaking in Types - CocoaConf San Jose
- @griotspeak, 2015 50
Function Overloading +(T, T) -> T © Speaking in Types
- CocoaConf San Jose - @griotspeak, 2015 51
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
Higher Kinded Types © Speaking in Types - CocoaConf San
Jose - @griotspeak, 2015 53
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
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
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
Higher Kinded Types We must repeat ourselves. This fact is
unfortunate. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 57
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
• The type system is our friend • Types can
hold more meaning than in Obj-C. © Speaking in Types - CocoaConf San Jose - @griotspeak, 2015 59
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