Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Speaking in Types
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
TJ Usiyan
October 16, 2015
Programming
44
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
89
Property-Based Testing with SwiftCheck
griotspeak
1
5.5k
Other Decks in Programming
See All in Programming
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.4k
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
470
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
150
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1.1k
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
280
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
120
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
160
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
130
Building an Out-of-Order CPU
latte72
1
750
Foundry Localでエージェント開発
seosoft
0
170
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
160
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
The Curious Case for Waylosing
cassininazir
1
500
The Cult of Friendly URLs
andyhume
79
7k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
730
New Earth Scene 8
popppiees
3
2.5k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Designing Powerful Visuals for Engaging Learning
tmiket
1
540
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The Limits of Empathy - UXLibs8
cassininazir
1
650
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
Unsuck your backbone
ammeep
672
58k
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