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
85
Property-Based Testing with SwiftCheck
griotspeak
1
5.5k
Other Decks in Programming
See All in Programming
Claude Code × Gemini × Ebitengine ゲーム制作素人WebエンジニアがGoでゲームを作った話
webzawa
0
210
検索設計から 推論設計への重心移動と Recall-First Retrieval
po3rin
5
1.5k
アクセシビリティ試験の"その後"を仕組み化する
yuuumiravy
1
190
Making the RBS Parser Faster
soutaro
0
650
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
2
290
サプライチェーン攻撃対策「層を重ねて落ちない壁」を10日間で組み上げた話 #TechLeadConf2026
kashewnuts
1
130
クラウドネイティブなエンジニアに向ける Raycastの魅力と実際の活用事例
nealle
2
230
運転動画を検索可能にする〜Cosmos-Embed1とDatabricks Vector Searchで〜/cosmos-embed1-databricks-vector-search
studio_graph
1
640
t *testing.T は どこからやってくるの?
otakakot
1
890
なぜあなたのコードには「コシ」がないのか?〜AI時代に問う、最後まで美味しい設計と戦略〜 #phpconkagawa / phpconkagawa2026
shogogg
0
110
実用!Hono RPC2026
yodaka
2
290
【26新卒研修】OpenAPI/Swagger REST API研修
dip_tech
PRO
0
130
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.9k
How GitHub (no longer) Works
holman
316
150k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
410
sira's awesome portfolio website redesign presentation
elsirapls
0
230
KATA
mclloyd
PRO
35
15k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.7k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
200
Done Done
chrislema
186
16k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
180
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
190
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
190
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