SlideShare a Scribd company logo
Ra c
) /
ED D
(-) / ) -
G I ED D
E
var number = 100
mysteryJob()
print(number)
let number = 100
mysteryJob()
print(number)
D DI
var number = 100
mysteryJob()
print(number)
// ?
let number = 100
mysteryJob()
print(number)
// 100
mutable immutable
F
var condition: Bool = true
if condition {
// true
} else {
// false
}
let condition: Bool = true
// case true
mutable immutable
F
var condition: Bool = true
var condition2: Bool = false
if condition {
if condition2 {
// true && true
} else {
// true && false
}
} else {
if condition2 {
// false && true
} else {
// false && false
}
}
let condition: Bool = true
let condition2: Bool = false
// case true && false
mutable immutable
F
var condition: Bool = true
var condition2: Bool = false
var condition3: Bool = false
if condition {
if condition2 {
if condition3 {
// true && true && true
} else {
// true && true && false
}
} else {
if condition3 {
// true && false && true
} else {
// true && false && false
}
}
} else {
if condition2 {
if condition3 {
// false && true && true
} else {
// false && true && false
}
} else {
if condition3 {
// false && false && true
} else {
// false && false && false
}
}
}
let condition: Bool = true
let condition2: Bool = false
let condition2: Bool = false
// case true && false && false
mutable immutable
/ D
Data
Program Program Program Program
Data
Program Program Program Program
mutable immutable
D C
mutable immutable
struct Hero {
var name : String
var nickname: String
}
var hero = Hero(name: "Steve Rogers",
nickname: "Captain America")
print(hero)
//Hero(name: "Steve Rogers",
nickname: "Captain America")
hero.nickname = "First Avenger"
print(hero)
//Hero(name: "Steve Rogers",
nickname: "First Avengers")
struct Hero {
var name : String
var nickname: String
}
let hero = Hero(name: "Steve Rogers",
nickname: "Captain America")
print(hero)
//Hero(name: "Steve Rogers",
nickname: "Captain America")
let captain = Hero(name: hero.name,
nickname: "First Avenger")
print(hero)
//Hero(name: "Steve Rogers",
nickname: "Captain America")
print(captain)
//Hero(name: "Steve Rogers",
nickname: "First Avengers")
ED D
1. Predictable

2. Testability

3. Thread-Safe
Maintainable
}
4. Unfamiliar

5. Memory wasting

6. Low performance

( in some case )
ED FC ED D
Maintenance
Performance
vs
ECF EC EC
Data
feature
AI
struct Hero {
var name: String
var nickname: String
}
let hero = Hero(name: "Steve Rogers",
nickname: "Captain America")
var captain = hero
captain.nickname = "First Avenger" Copy On Write
HD C
protocol Mappable {
func map<U>(_ f: (Self) -> U) -> U
}
extension Mappable {
func map<U>(_ f: (Self) -> U) -> U {
return f(self)
}
}
extension Hero: Mappable { }
let hero = Hero(name: "Steve Rogers",
nickname: "Captain America")
let captain = hero.map { hero -> Hero in
var h = hero
h.nickname = "First Avenger"
return h
}
DD DD
extension Hero {
func get<Value>(_ kp: KeyPath<Hero, Value>) -> Value {
return self[keyPath: kp]
}
func set<Value>(_ kp: WritableKeyPath<Hero, Value>,
_ v: Value) -> Hero {
var h = self
h[keyPath: kp] = v
return h
}
}
let hero = Hero(name: "Steve Rogers",
nickname: "Captain America")
hero.get(.nickname)
//Captain America
let captain = hero.set(.nickname, "First Avenger")
C
struct Lens<Whole, Part> {
let get: (Whole) -> Part
let set: (Whole, Part) -> Whole
}
let heroNickNameLens: Lens<Hero, String> = Lens(
get: { $0.nickname },
set: {
var h = $0
h.nickname = $1
return h
}
)
let hero = Hero(name: "Steve Rogers",
nickname: "Captain America")
let captain = heroNickNameLens.set(hero, "First Avenger")
C
protocol Lensable {
static func lens<Part>(_ wkp: WritableKeyPath<Self, Part>) -> Lens<Self, Part>
}
extension Lensable {
static func lens<Part>(_ wkp: WritableKeyPath<Self, Part>) -> Lens<Self, Part> {
return Lens(
get: { whole in whole[keyPath: wkp] },
set: { whole, part in
var mutableWhole = whole
mutableWhole[keyPath: wkp] = part
return mutableWhole
}
)
}
}
extension Hero: Lensable {}
let hero = Hero(name: "Steve Rogers",
nickname: "Captain America")
let captain = Hero.lens(.nickname).set(hero, "First Avenger")
E D AD C
http://www.cs.ox.ac.uk/people/jeremy.gibbons/publications/poptics.pdf
https://github.com/hablapps/DontFearTheProfunctorOptics
feature
Data
E D
func valueChanger<T, U>(value: T, _ f: (T) -> U) -> U {
return f(value)
}
let name = "Original"
// Original
let changedName = valueChanger(value: name) { "($0) Changed" }
// Original Changed
E D
class Functor<T> {
let value: T
init(_ v: T) {
value = v
}
func map<U>(_ f: (T) -> U) -> Functor<U> {
let u = f(value)
return Functor<U>(u)
}
}
E D
let name = "Original" // Original
let changedName = Functor(name).map { "($0) Changed" }.value
// Original Changed
let changedNameLength = Functor(name) // Functor<String>
.map { "($0) Changed" } // Functor<String>
.map { $0.count } // Functor<Int>
.map { $0 * $0 } // Functor<Int>
.value // Int
// 256
E D
func stringLength(_ s: String) -> Functor<Int> {
return Functor(s).map { $0.count }
}
let name = "Original" // Original
let changedName = Functor(name).map { "($0) Changed" }.value
// Original Changed
let changedNameLength = Functor(name) // Functor<String>
.map { "($0) Changed" } // Functor<String>
.map (stringLength) // Functor<Functor<Int>>
.map { $0 * $0 }
.value
E D
func stringLength(_ s: String) -> Functor<Int> {
return Functor(s).map { $0.count }
}
let name = "Original" // Original
let changedName = Functor(name).map { "($0) Changed" }.value
// Original Changed
let changedNameLength = Functor(name) // Functor<String>
.map { "($0) Changed" } // Functor<String>
.map (stringLength) // Functor<Functor<Int>>
.map { $0 * $0 }
.value
Functor<Functor<Int>> 의 중첩된 것을 단일(Mono)하게 만들어야 함.
class Monad<T>: Functor<T> {
override func map<U>(_ f: (T) -> U) -> Monad<U> {
let cu = super.map(f)
return Monad<U>(cu.value)
}
func flatMap<U>(_ f: (T) -> Functor<U>) -> Monad<U> {
let fu = f(value)
return Monad<U>(fu.value)
}
}
func stringLength(_ s: String) -> Functor<Int> {
return Functor(s).map { $0.count }
}
let name = "Original" // Original
let changedName = Monad(name).map { "($0) Changed" }.value
// Original Changed
let changedNameLength = Monad(name) // Monad<String>
.map { "($0) Changed" } // Monad<String>
.flatMap (stringLength) // Monad<Int>
.map { $0 * $0 } // Monad<Int>
.value // Int
//256
E I
Immutable data 는 변하지 않는 값
f
g = f - ) -
b df - )
-) ).-
e f P
map / flatMap
Data
get / set
유지보수하기 좋다
20190330 immutable data

More Related Content

PDF
Functional programming with php7
PDF
Extbase and Beyond
PDF
PHP 101
PPT
Developing iOS apps with Swift
PDF
Climbing the Abstract Syntax Tree (php[world] 2019)
PDF
Climbing the Abstract Syntax Tree (Bulgaria PHP 2016)
PDF
3 1. preprocessor, math, stdlib
PDF
Climbing the Abstract Syntax Tree (Forum PHP 2017)
Functional programming with php7
Extbase and Beyond
PHP 101
Developing iOS apps with Swift
Climbing the Abstract Syntax Tree (php[world] 2019)
Climbing the Abstract Syntax Tree (Bulgaria PHP 2016)
3 1. preprocessor, math, stdlib
Climbing the Abstract Syntax Tree (Forum PHP 2017)

What's hot (20)

PDF
Pooya Khaloo Presentation on IWMC 2015
PDF
Climbing the Abstract Syntax Tree (PHP UK 2018)
PPTX
Php & my sql
PDF
Climbing the Abstract Syntax Tree (Midwest PHP 2020)
PDF
Climbing the Abstract Syntax Tree (PHP Russia 2019)
PPT
Class 4 - PHP Arrays
PDF
Climbing the Abstract Syntax Tree (IPC Fall 2017)
PDF
Climbing the Abstract Syntax Tree (CodeiD PHP Odessa 2017)
PDF
Symfony2 - extending the console component
PDF
Unittests für Dummies
PDF
A swift introduction to Swift
PDF
Climbing the Abstract Syntax Tree (ScotlandPHP 2018)
PDF
Swift Programming Language
PDF
Climbing the Abstract Syntax Tree (Southeast PHP 2018)
PPTX
A Few Interesting Things in Apple's Swift Programming Language
PDF
Funkcija, objekt, python
PDF
Climbing the Abstract Syntax Tree (DPC 2017)
PDF
Climbing the Abstract Syntax Tree (phpDay 2017)
PDF
Talk - Query monad
PDF
Climbing the Abstract Syntax Tree (PHP Developer Days Dresden 2018)
Pooya Khaloo Presentation on IWMC 2015
Climbing the Abstract Syntax Tree (PHP UK 2018)
Php & my sql
Climbing the Abstract Syntax Tree (Midwest PHP 2020)
Climbing the Abstract Syntax Tree (PHP Russia 2019)
Class 4 - PHP Arrays
Climbing the Abstract Syntax Tree (IPC Fall 2017)
Climbing the Abstract Syntax Tree (CodeiD PHP Odessa 2017)
Symfony2 - extending the console component
Unittests für Dummies
A swift introduction to Swift
Climbing the Abstract Syntax Tree (ScotlandPHP 2018)
Swift Programming Language
Climbing the Abstract Syntax Tree (Southeast PHP 2018)
A Few Interesting Things in Apple's Swift Programming Language
Funkcija, objekt, python
Climbing the Abstract Syntax Tree (DPC 2017)
Climbing the Abstract Syntax Tree (phpDay 2017)
Talk - Query monad
Climbing the Abstract Syntax Tree (PHP Developer Days Dresden 2018)
Ad

Similar to 20190330 immutable data (20)

PDF
JavaScript for PHP developers
DOC
Jsphp 110312161301-phpapp02
PDF
Generics and Inference
ODP
Scala 2 + 2 > 4
PPT
DataTypes.ppt
PDF
Introduction to Swift programming language.
PDF
I keep on get a redefinition error and an undefined error.Customer.pdf
PDF
Functional Programming in PHP
PDF
Taking Perl to Eleven with Higher-Order Functions
PDF
Functional Programming with Groovy
PPTX
Academy PRO: ES2015
PDF
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
PDF
Swift 3.0 の新しい機能(のうちの9つ)
PDF
Swift 함수 커링 사용하기
PPTX
Php functions
PDF
Smelling your code
PPT
SDC - Einführung in Scala
PPT
Wakanday JS201 Best Practices
PDF
PHP Tips & Tricks
PDF
Introduction to ECMAScript 2015
JavaScript for PHP developers
Jsphp 110312161301-phpapp02
Generics and Inference
Scala 2 + 2 > 4
DataTypes.ppt
Introduction to Swift programming language.
I keep on get a redefinition error and an undefined error.Customer.pdf
Functional Programming in PHP
Taking Perl to Eleven with Higher-Order Functions
Functional Programming with Groovy
Academy PRO: ES2015
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift 3.0 の新しい機能(のうちの9つ)
Swift 함수 커링 사용하기
Php functions
Smelling your code
SDC - Einführung in Scala
Wakanday JS201 Best Practices
PHP Tips & Tricks
Introduction to ECMAScript 2015
Ad

More from Chiwon Song (20)

PDF
20250425_AI가 코딩하는 시대에 개발자가 되겠다구요_.pdf
PDF
20250210_AI가 코딩하는시대에 개발자 되기 - Google Slides.pdf
PDF
20240330_고급진 코드를 위한 exception 다루기
PDF
요즘 유행하는 AI 나도 해보자 (feat. CoreML)
PDF
20220716_만들면서 느껴보는 POP
PDF
20210812 컴퓨터는 어떻게 동작하는가?
PDF
20201121 코드 삼분지계
PDF
20200815 inversions
PDF
20191116 custom operators in swift
PDF
[20190601] 직업훈련교사_수업의실행_교안
PPTX
[20190601] 직업훈련교사_수업의실행
PPTX
20190306 만들면서 배우는 IoT / IoT의 이해
PDF
20181020 advanced higher-order function
PDF
20180721 code defragment
PDF
20180310 functional programming
PDF
20171104 FRP 패러다임
PDF
스크래치로 시작하는 코딩
PPTX
메이커운동과 아두이노
PPTX
아두이노 RC카 만들기
PPTX
[5] 아두이노로 만드는 IoT
20250425_AI가 코딩하는 시대에 개발자가 되겠다구요_.pdf
20250210_AI가 코딩하는시대에 개발자 되기 - Google Slides.pdf
20240330_고급진 코드를 위한 exception 다루기
요즘 유행하는 AI 나도 해보자 (feat. CoreML)
20220716_만들면서 느껴보는 POP
20210812 컴퓨터는 어떻게 동작하는가?
20201121 코드 삼분지계
20200815 inversions
20191116 custom operators in swift
[20190601] 직업훈련교사_수업의실행_교안
[20190601] 직업훈련교사_수업의실행
20190306 만들면서 배우는 IoT / IoT의 이해
20181020 advanced higher-order function
20180721 code defragment
20180310 functional programming
20171104 FRP 패러다임
스크래치로 시작하는 코딩
메이커운동과 아두이노
아두이노 RC카 만들기
[5] 아두이노로 만드는 IoT

Recently uploaded (20)

PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
KodekX | Application Modernization Development
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Modernizing your data center with Dell and AMD
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Empathic Computing: Creating Shared Understanding
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
MYSQL Presentation for SQL database connectivity
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
KodekX | Application Modernization Development
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
NewMind AI Weekly Chronicles - August'25 Week I
Per capita expenditure prediction using model stacking based on satellite ima...
Spectral efficient network and resource selection model in 5G networks
Review of recent advances in non-invasive hemoglobin estimation
Understanding_Digital_Forensics_Presentation.pptx
Chapter 3 Spatial Domain Image Processing.pdf
The AUB Centre for AI in Media Proposal.docx
Modernizing your data center with Dell and AMD
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Empathic Computing: Creating Shared Understanding

20190330 immutable data

  • 1. Ra c ) / ED D (-) / ) -
  • 2. G I ED D
  • 3. E var number = 100 mysteryJob() print(number) let number = 100 mysteryJob() print(number)
  • 4. D DI var number = 100 mysteryJob() print(number) // ? let number = 100 mysteryJob() print(number) // 100 mutable immutable
  • 5. F var condition: Bool = true if condition { // true } else { // false } let condition: Bool = true // case true mutable immutable
  • 6. F var condition: Bool = true var condition2: Bool = false if condition { if condition2 { // true && true } else { // true && false } } else { if condition2 { // false && true } else { // false && false } } let condition: Bool = true let condition2: Bool = false // case true && false mutable immutable
  • 7. F var condition: Bool = true var condition2: Bool = false var condition3: Bool = false if condition { if condition2 { if condition3 { // true && true && true } else { // true && true && false } } else { if condition3 { // true && false && true } else { // true && false && false } } } else { if condition2 { if condition3 { // false && true && true } else { // false && true && false } } else { if condition3 { // false && false && true } else { // false && false && false } } } let condition: Bool = true let condition2: Bool = false let condition2: Bool = false // case true && false && false mutable immutable
  • 8. / D Data Program Program Program Program Data Program Program Program Program mutable immutable
  • 9. D C mutable immutable struct Hero { var name : String var nickname: String } var hero = Hero(name: "Steve Rogers", nickname: "Captain America") print(hero) //Hero(name: "Steve Rogers", nickname: "Captain America") hero.nickname = "First Avenger" print(hero) //Hero(name: "Steve Rogers", nickname: "First Avengers") struct Hero { var name : String var nickname: String } let hero = Hero(name: "Steve Rogers", nickname: "Captain America") print(hero) //Hero(name: "Steve Rogers", nickname: "Captain America") let captain = Hero(name: hero.name, nickname: "First Avenger") print(hero) //Hero(name: "Steve Rogers", nickname: "Captain America") print(captain) //Hero(name: "Steve Rogers", nickname: "First Avengers")
  • 10. ED D 1. Predictable 2. Testability 3. Thread-Safe Maintainable } 4. Unfamiliar 5. Memory wasting 6. Low performance ( in some case )
  • 11. ED FC ED D Maintenance Performance vs
  • 14. AI struct Hero { var name: String var nickname: String } let hero = Hero(name: "Steve Rogers", nickname: "Captain America") var captain = hero captain.nickname = "First Avenger" Copy On Write
  • 15. HD C protocol Mappable { func map<U>(_ f: (Self) -> U) -> U } extension Mappable { func map<U>(_ f: (Self) -> U) -> U { return f(self) } } extension Hero: Mappable { } let hero = Hero(name: "Steve Rogers", nickname: "Captain America") let captain = hero.map { hero -> Hero in var h = hero h.nickname = "First Avenger" return h }
  • 16. DD DD extension Hero { func get<Value>(_ kp: KeyPath<Hero, Value>) -> Value { return self[keyPath: kp] } func set<Value>(_ kp: WritableKeyPath<Hero, Value>, _ v: Value) -> Hero { var h = self h[keyPath: kp] = v return h } } let hero = Hero(name: "Steve Rogers", nickname: "Captain America") hero.get(.nickname) //Captain America let captain = hero.set(.nickname, "First Avenger")
  • 17. C struct Lens<Whole, Part> { let get: (Whole) -> Part let set: (Whole, Part) -> Whole } let heroNickNameLens: Lens<Hero, String> = Lens( get: { $0.nickname }, set: { var h = $0 h.nickname = $1 return h } ) let hero = Hero(name: "Steve Rogers", nickname: "Captain America") let captain = heroNickNameLens.set(hero, "First Avenger")
  • 18. C protocol Lensable { static func lens<Part>(_ wkp: WritableKeyPath<Self, Part>) -> Lens<Self, Part> } extension Lensable { static func lens<Part>(_ wkp: WritableKeyPath<Self, Part>) -> Lens<Self, Part> { return Lens( get: { whole in whole[keyPath: wkp] }, set: { whole, part in var mutableWhole = whole mutableWhole[keyPath: wkp] = part return mutableWhole } ) } } extension Hero: Lensable {} let hero = Hero(name: "Steve Rogers", nickname: "Captain America") let captain = Hero.lens(.nickname).set(hero, "First Avenger")
  • 19. E D AD C http://www.cs.ox.ac.uk/people/jeremy.gibbons/publications/poptics.pdf https://github.com/hablapps/DontFearTheProfunctorOptics
  • 21. E D func valueChanger<T, U>(value: T, _ f: (T) -> U) -> U { return f(value) } let name = "Original" // Original let changedName = valueChanger(value: name) { "($0) Changed" } // Original Changed
  • 22. E D class Functor<T> { let value: T init(_ v: T) { value = v } func map<U>(_ f: (T) -> U) -> Functor<U> { let u = f(value) return Functor<U>(u) } }
  • 23. E D let name = "Original" // Original let changedName = Functor(name).map { "($0) Changed" }.value // Original Changed let changedNameLength = Functor(name) // Functor<String> .map { "($0) Changed" } // Functor<String> .map { $0.count } // Functor<Int> .map { $0 * $0 } // Functor<Int> .value // Int // 256
  • 24. E D func stringLength(_ s: String) -> Functor<Int> { return Functor(s).map { $0.count } } let name = "Original" // Original let changedName = Functor(name).map { "($0) Changed" }.value // Original Changed let changedNameLength = Functor(name) // Functor<String> .map { "($0) Changed" } // Functor<String> .map (stringLength) // Functor<Functor<Int>> .map { $0 * $0 } .value
  • 25. E D func stringLength(_ s: String) -> Functor<Int> { return Functor(s).map { $0.count } } let name = "Original" // Original let changedName = Functor(name).map { "($0) Changed" }.value // Original Changed let changedNameLength = Functor(name) // Functor<String> .map { "($0) Changed" } // Functor<String> .map (stringLength) // Functor<Functor<Int>> .map { $0 * $0 } .value Functor<Functor<Int>> 의 중첩된 것을 단일(Mono)하게 만들어야 함.
  • 26. class Monad<T>: Functor<T> { override func map<U>(_ f: (T) -> U) -> Monad<U> { let cu = super.map(f) return Monad<U>(cu.value) } func flatMap<U>(_ f: (T) -> Functor<U>) -> Monad<U> { let fu = f(value) return Monad<U>(fu.value) } }
  • 27. func stringLength(_ s: String) -> Functor<Int> { return Functor(s).map { $0.count } } let name = "Original" // Original let changedName = Monad(name).map { "($0) Changed" }.value // Original Changed let changedNameLength = Monad(name) // Monad<String> .map { "($0) Changed" } // Monad<String> .flatMap (stringLength) // Monad<Int> .map { $0 * $0 } // Monad<Int> .value // Int //256
  • 28. E I Immutable data 는 변하지 않는 값 f g = f - ) - b df - ) -) ).- e f P map / flatMap Data get / set 유지보수하기 좋다