SlideShare a Scribd company logo
1 of 31
Download to read offline
Functional Programming 

in Swift
Kaz Yoshikawa

kyoshikawa@electricwoods.com
December 2014
What is Functional
Programming?
関数型言語(かんすうがたげんご、functional language)
は、関数型プログラミングに向いた特徴を持つプログラミ
ング言語、関数型プログラミング言語である。引数に関数
を作用(applicate)させて計算をおこなうことから、作
用型言語(applicational language)ともいう。データフ
ロープログラミング言語も関数型言語の一種である。
- Wikipedia
What is Functional
Programming?
In computer science, functional programming is a programming
paradigm, a style of building the structure and elements of computer
programs, that treats computation as the evaluation of mathematical
functions and avoids changing-state and mutable data. It is a
declarative programming paradigm, which means programming is
done with expressions. In functional code, the output value of a
function depends only on the arguments that are input to the function,
so calling a function f twice with the same value for an argument x will
produce the same result f(x) each time. Eliminating side effects, i.e.
changes in state that do not depend on the function inputs, can make
it much easier to understand and predict the behavior of a program,
which is one of the key motivations for the development of functional
programming.
- Wikipedia, en
What is Functional
Programming?
コンピュータサイエンスでは、functional programming は、構造と要素
を組み立てるスタイル形式のコンピュータプログラムであり、処理
(computation)を数学的な関数の評価として扱い、ステートの変更
やデータの変化を避ける。それは、宣言的プログラミングパラダイムで
あり、プログラミングを表現式として行う。関数のコードでは、関数の
出力結果は、その関数への引数が唯一依存し、関数 f を引数 x で2度
呼び出した場合でも、それぞれの結果は毎度同じ f(x) であるものとす
る。副作用の排除、すなわちその関数の入力に依存しないステートの変
更、はプログラムの挙動を推測しやすく理解しやすくする事が可能にな
り、それが、functional programming で開発するモチベーションの
の一つである。
- Wikipedia En, - 翻訳:吉川
with state without state
ステート無 ステート有
ƒ ƒ
x x x x
s
a a b c
Compositing stateless
functions
ƒ
g r
p q s t
ステート有
ƒ
g r
p q s t
ステート無
Functional Programming
• ステートを持たない
• 変数を変化させない ?
• 関数はその手順よりも、どうあるべきか記述する
• Value Oriented Programming*
• 関数はValueとなる
• マルチスレッドでハイパフォーマンスを期待できる
* Swift Functional Programming
Functional-ish
class Counter {
var counter = 0
func count(count: Int) { counter += count }
}
var counter = Counter()
counter.count(7)
counter.count(10)
println(counter.counter) // 17
let list = ["c", "d", "a", "b"]
var string = sorted(list)
.map({$0.uppercaseString})
.reduce("") {$0 + $1}
println(string) // "ABCD"
Object Oriented 的
Functional 的
Function Chaining
• Unix の パイプのように、関数をつなげて、より高
度な目的をシンプルに達成可能
• 関数の動作が変数などに依存していると、関数を単
純につなげても副作用の恐れがある
• グローバル変数に依存したコードの再利用が難し
い構造に似ている
Function without modifying
data collection?
• Array や Dictionary は コピーを使う
var list1 = [1, 2, 3]
var list2 = list1; // 参照ではなくコピー
list2.append(4)
var list3 = list2 // 参照ではなくコピー
list3.append(5)
println(list1) // 1,2,3 <- 変化なし
println(list2) // 1,2,3,4 <- 変化なし
println(list3) // 1,2,3,4,5
• 代入文では参照ではなくコピーされる
• でもこれって値の変更じゃん!
Ideally Immutable, but…

• 関数やメソッド内の結果の影響をその範囲に限定させる
• その関数内で変数を変更しても、その影響をプロパティ
などに足跡として残さない
• 変数を変更している最中に別スレッドから同じ関数が呼
ばれた場合でもお互いに影響させない
• スレッドが別でもローカル変数は影響を受けない
• @synchronized がいらなくなる?
High Order Function
What is High Order
Function?
高階関数(こうかいかんすう、英: higher-order function)とは、関数(手
続き)を引数にしたり、あるいは関数(手続き)を戻り値とするような関
数のことである。
(省略)
高階関数は関数を引数にしたり、あるいは関数を戻り値とするものであ
り、引数や戻り値の関数もまた高階関数となり得る。高階関数は主に関数
型言語やその背景理論であるラムダ計算において多用される。
また、ある関数(手続き)の引数となる関数(手続き)のことを関数引数
[1]や手続き引数[2]と呼ぶこともある。
- Wikipedia, Ja
High Order Function
• 関数を引数に与える事ができる
• 関数を戻り値できる
map
let inputs = [10.0, 20.0, 45.0]
var outputs = [Double]()
for value in inputs {
outputs.append(value * 0.7)
}
println(outputs) // "[7.0, 14.0, 31.5]"
let inputs = [10.0, 20.0, 45.0]
var outputs = map(inputs, { x in x * 0.7})
println(outputs) // "[7.0, 14.0, 31.5]"
[ x1, x2, ... , xn].map(f) -> [f(x1), f(x2), ... , f(xn)]
*1 http://www.weheartswift.com
*1
{x in x}
let outputs = map(inputs, { x in x * 0.7})
var outputs = [Double]()
for x in inputs {
outputs.append(x * 0.7)
}
filter
• Dictionary の場合
• Array の場合
let inputs = ["Ken":64, "Joe":23, "Jack":32, "Alex":75]
let outputs = filter(inputs, { key, value -> Bool in
value < 40
})
println(outputs) // "[(Joe, 23), (Jack, 32)]"
let inputs = [64, 23, 32, 75]
let outputs = filter(inputs, { value -> Bool in
value < 40
})
println(outputs) // "[23, 32]"
reduce
*1 http://ijoshsmith.com/2014/06/25/understanding-swifts-reduce-method/
*1
頭の体操
• Dictionary の Arrayから、それぞれの key に対す
る値の和を求めた Dictionary を求めよ。
let outputs = reduce(inputs, [String:Int]()) { (a, b) in
var d = a
for (k, v) in b {
d[k] = (d[k] ?? 0) + v
}
return d
}
println(outputs) // [e: 10, w: 7]
e の和 と w の和を求める
たぶん Functional な方
法があるにちがいない
let inputs = [["e":5], ["w":4], ["e":3], ["w":3, "e": 2]]
Currying
Currying
カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関
数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残り
の引数を取り結果を返す関数」であるような関数にすること(あるいはそ
の関数のこと)である。
(略)
ごく簡単な例として、f(a, b) = c という関数 f があるときに、F(a) = g(こ
こで、g は g(b) = c となる関数である)という関数 F が、f のカリー化
である。
- Wikipedia, ja
Currying
In mathematics and computer science, currying is the
technique of translating the evaluation of a function that
takes multiple arguments (or a tuple of arguments) into
evaluating a sequence of functions, each with a single
argument (partial application). It was introduced by Moses
Schönfinkel and later developed by Haskell Curry.
- Wikipedia, en
Currying
数学とコンピュータサイエンスにおいて、カリー化とは、
複数の引数を取る関数の評価を、引数を一つだけ持つ関
数(partial application: 部分適用)のシーケンスに変換
するテクニックである。
- Wikipedia, en
翻訳: 吉川
Add
• これまでの加算
func add(x: Int, y: Int) -> Int {
return x + y
}
add(2, 3) // 5
• Functional ちっくな加算
func add(x: Int) -> (Int -> Int) {
return { y in return x + y }
}
add(2)(3) // 5
let add2 = add(2)
add2(3) // 5
Currying
https://github.com/typelift/swiftz/blob/master/swiftz/Curry.swift
public func curry<A,B,C>(f: (A,B) -> C) -> A -> B -> C {
return { a in { b in f(a,b) } }
}
public func curry<A,B,C,D>(f: (A,B,C) -> D) -> A -> B -> C -> D {
return { a in { b in { c in f(a,b,c) } } }
}
public func curry<A,B,C,D,E>(f: (A,B,C,D) -> E) -> A -> B -> C -> D -> E
return { a in { b in { c in { d in f(a,b,c,d) } } } }
}
curry(+)(100)(2) // 102
curry(+)("Hello, ")("World") // "Hello, World"
What curry<A,B,C> 

can do for you?
func add(x: Int, y: Int) -> Int {
return x + y
}
public func curry<A,B,C>(f: (A,B) -> C) -> A -> B -> C {
return { a in { b in f(a,b) } }
}
curry(add)(100)(3) // 103
let add100 = curry(add)(100)
add100(3) // 103
What’s gonna happen to
Object Oriented
Programming?
Are they going to extinct?
User Interface
• UIWindow, NSWindow は class なので参照!
• Foundation ぽい所は Functional
• UIやモデルなどプロパティやステートの更新を必要
とする部分は Object Oriented
var window = UIWindow(frame: UIScreen.mainScreen().applicationFrame)
window.backgroundColor = UIColor.whiteColor() // do not copy
Wrap up
Wrap up
• 複雑なコードを完結に書く事が可能
• 再現性が高くバグの少ないコードを書く事が可能
• 学習曲線がきついく、OOPで5分で書けるコードを
30分悩んで書く事も
• Objective Oriented Programming も健在
Thank you

More Related Content

What's hot

「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
Brand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIBrand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIbitter_fox
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjavaきつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjavabitter_fox
 
Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Eugene Yokota
 
Material
MaterialMaterial
Material_TUNE_
 

What's hot (7)

「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
Brand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIBrand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPI
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjavaきつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
 
Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)
 
Material
MaterialMaterial
Material
 

Viewers also liked

Swift bondでつなげてプログラミング
Swift bondでつなげてプログラミングSwift bondでつなげてプログラミング
Swift bondでつなげてプログラミング貴士 山本
 
What is reactive programming?
What is reactive programming?What is reactive programming?
What is reactive programming?Kenji Tanaka
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテストYoichiro Sakurai
 
iOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtipsiOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtips今城 善矩
 
ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用Fumiya Sakai
 
App extension for iOS
App extension for iOSApp extension for iOS
App extension for iOStoyship
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜Takao Sumitomo
 
iOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotipsiOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotipsYusuke Kita
 
テストの種類とBDD #33testing
テストの種類とBDD #33testingテストの種類とBDD #33testing
テストの種類とBDD #33testingKoji Hasegawa
 
Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化健一 辰濱
 
User Scenario based UI testing with KIF
User Scenario based UI testing with KIFUser Scenario based UI testing with KIF
User Scenario based UI testing with KIFYusuke Kita
 
ご注文はRxですか? -RxSwiftを実際に導入してみた件-
ご注文はRxですか? -RxSwiftを実際に導入してみた件-ご注文はRxですか? -RxSwiftを実際に導入してみた件-
ご注文はRxですか? -RxSwiftを実際に導入してみた件-Keisuke Tatsumi
 
リアクティブプログラミング
リアクティブプログラミングリアクティブプログラミング
リアクティブプログラミングYuuki Takano
 
おもしろく働くための「わらしべ長者方式」
おもしろく働くための「わらしべ長者方式」おもしろく働くための「わらしべ長者方式」
おもしろく働くための「わらしべ長者方式」Shuichi Tsutsumi
 
Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1一希 大田
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-torisoup
 
Android cleanarchitecture
Android cleanarchitectureAndroid cleanarchitecture
Android cleanarchitectureTomoaki Imai
 

Viewers also liked (20)

Swift bondでつなげてプログラミング
Swift bondでつなげてプログラミングSwift bondでつなげてプログラミング
Swift bondでつなげてプログラミング
 
What is reactive programming?
What is reactive programming?What is reactive programming?
What is reactive programming?
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 
iOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtipsiOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtips
 
ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用
 
App extension for iOS
App extension for iOSApp extension for iOS
App extension for iOS
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜
 
Unity testtool
Unity testtoolUnity testtool
Unity testtool
 
iOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotipsiOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotips
 
テストの種類とBDD #33testing
テストの種類とBDD #33testingテストの種類とBDD #33testing
テストの種類とBDD #33testing
 
Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化
 
User Scenario based UI testing with KIF
User Scenario based UI testing with KIFUser Scenario based UI testing with KIF
User Scenario based UI testing with KIF
 
ご注文はRxですか? -RxSwiftを実際に導入してみた件-
ご注文はRxですか? -RxSwiftを実際に導入してみた件-ご注文はRxですか? -RxSwiftを実際に導入してみた件-
ご注文はRxですか? -RxSwiftを実際に導入してみた件-
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
リアクティブプログラミング
リアクティブプログラミングリアクティブプログラミング
リアクティブプログラミング
 
おもしろく働くための「わらしべ長者方式」
おもしろく働くための「わらしべ長者方式」おもしろく働くための「わらしべ長者方式」
おもしろく働くための「わらしべ長者方式」
 
Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
 
Android cleanarchitecture
Android cleanarchitectureAndroid cleanarchitecture
Android cleanarchitecture
 
Latihan tatabahasa 1
Latihan tatabahasa 1Latihan tatabahasa 1
Latihan tatabahasa 1
 

Similar to Functional Programming in Swift

Javascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional ProgrammingJavascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional Programmingtodorokit
 
[Basic 12] 関数型言語 / 型理論
[Basic 12] 関数型言語 / 型理論[Basic 12] 関数型言語 / 型理論
[Basic 12] 関数型言語 / 型理論Yuto Takei
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
po-3. 式の抽象化と関数
po-3. 式の抽象化と関数po-3. 式の抽象化と関数
po-3. 式の抽象化と関数kunihikokaneko1
 
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) kunihikokaneko1
 
融合変換による最適化の理論的基盤と正当性 (2006-06-27)
融合変換による最適化の理論的基盤と正当性 (2006-06-27)融合変換による最適化の理論的基盤と正当性 (2006-06-27)
融合変換による最適化の理論的基盤と正当性 (2006-06-27)Masahiro Sakai
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
普通のプログラミング言語R
普通のプログラミング言語R普通のプログラミング言語R
普通のプログラミング言語RShuyo Nakatani
 
2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)Shin-ya Koga
 
関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013Esehara Shigeo
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』Kenta USAMI
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
Web講座 第8回
Web講座 第8回Web講座 第8回
Web講座 第8回nanametown
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdfKazuaki Ishizaki
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようYuya Takeyama
 

Similar to Functional Programming in Swift (20)

Javascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional ProgrammingJavascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional Programming
 
[Basic 12] 関数型言語 / 型理論
[Basic 12] 関数型言語 / 型理論[Basic 12] 関数型言語 / 型理論
[Basic 12] 関数型言語 / 型理論
 
Haskell
HaskellHaskell
Haskell
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
po-3. 式の抽象化と関数
po-3. 式の抽象化と関数po-3. 式の抽象化と関数
po-3. 式の抽象化と関数
 
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム) cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)
 
融合変換による最適化の理論的基盤と正当性 (2006-06-27)
融合変換による最適化の理論的基盤と正当性 (2006-06-27)融合変換による最適化の理論的基盤と正当性 (2006-06-27)
融合変換による最適化の理論的基盤と正当性 (2006-06-27)
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
普通のプログラミング言語R
普通のプログラミング言語R普通のプログラミング言語R
普通のプログラミング言語R
 
2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)
 
関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
PHP 入門
PHP 入門PHP 入門
PHP 入門
 
Web講座 第8回
Web講座 第8回Web講座 第8回
Web講座 第8回
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
 
Refactoring point of Kotlin application
Refactoring point of Kotlin applicationRefactoring point of Kotlin application
Refactoring point of Kotlin application
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 

More from Kaz Yoshikawa

e-Conte board Getting Started
e-Conte board Getting Startede-Conte board Getting Started
e-Conte board Getting StartedKaz Yoshikawa
 
iOS In-App-Purchase verifying receipt locally in Swift
iOS In-App-Purchase verifying receipt locally in SwiftiOS In-App-Purchase verifying receipt locally in Swift
iOS In-App-Purchase verifying receipt locally in SwiftKaz Yoshikawa
 
Idioms in swift 2016 05c
Idioms in swift 2016 05cIdioms in swift 2016 05c
Idioms in swift 2016 05cKaz Yoshikawa
 
Extracting text from PDF (iOS)
Extracting text from PDF (iOS)Extracting text from PDF (iOS)
Extracting text from PDF (iOS)Kaz Yoshikawa
 
Programming Complex Algorithm in Swift
Programming Complex Algorithm in SwiftProgramming Complex Algorithm in Swift
Programming Complex Algorithm in SwiftKaz Yoshikawa
 
Programming Language Swift Overview
Programming Language Swift OverviewProgramming Language Swift Overview
Programming Language Swift OverviewKaz Yoshikawa
 

More from Kaz Yoshikawa (8)

e-Conte board Getting Started
e-Conte board Getting Startede-Conte board Getting Started
e-Conte board Getting Started
 
iOS In-App-Purchase verifying receipt locally in Swift
iOS In-App-Purchase verifying receipt locally in SwiftiOS In-App-Purchase verifying receipt locally in Swift
iOS In-App-Purchase verifying receipt locally in Swift
 
URLSession Reloaded
URLSession ReloadedURLSession Reloaded
URLSession Reloaded
 
Idioms in swift 2016 05c
Idioms in swift 2016 05cIdioms in swift 2016 05c
Idioms in swift 2016 05c
 
Extracting text from PDF (iOS)
Extracting text from PDF (iOS)Extracting text from PDF (iOS)
Extracting text from PDF (iOS)
 
Programming Complex Algorithm in Swift
Programming Complex Algorithm in SwiftProgramming Complex Algorithm in Swift
Programming Complex Algorithm in Swift
 
Programming Language Swift Overview
Programming Language Swift OverviewProgramming Language Swift Overview
Programming Language Swift Overview
 
Newsstand
NewsstandNewsstand
Newsstand
 

Functional Programming in Swift

  • 1. Functional Programming 
 in Swift Kaz Yoshikawa
 kyoshikawa@electricwoods.com December 2014
  • 2. What is Functional Programming? 関数型言語(かんすうがたげんご、functional language) は、関数型プログラミングに向いた特徴を持つプログラミ ング言語、関数型プログラミング言語である。引数に関数 を作用(applicate)させて計算をおこなうことから、作 用型言語(applicational language)ともいう。データフ ロープログラミング言語も関数型言語の一種である。 - Wikipedia
  • 3. What is Functional Programming? In computer science, functional programming is a programming paradigm, a style of building the structure and elements of computer programs, that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data. It is a declarative programming paradigm, which means programming is done with expressions. In functional code, the output value of a function depends only on the arguments that are input to the function, so calling a function f twice with the same value for an argument x will produce the same result f(x) each time. Eliminating side effects, i.e. changes in state that do not depend on the function inputs, can make it much easier to understand and predict the behavior of a program, which is one of the key motivations for the development of functional programming. - Wikipedia, en
  • 4. What is Functional Programming? コンピュータサイエンスでは、functional programming は、構造と要素 を組み立てるスタイル形式のコンピュータプログラムであり、処理 (computation)を数学的な関数の評価として扱い、ステートの変更 やデータの変化を避ける。それは、宣言的プログラミングパラダイムで あり、プログラミングを表現式として行う。関数のコードでは、関数の 出力結果は、その関数への引数が唯一依存し、関数 f を引数 x で2度 呼び出した場合でも、それぞれの結果は毎度同じ f(x) であるものとす る。副作用の排除、すなわちその関数の入力に依存しないステートの変 更、はプログラムの挙動を推測しやすく理解しやすくする事が可能にな り、それが、functional programming で開発するモチベーションの の一つである。 - Wikipedia En, - 翻訳:吉川
  • 5. with state without state ステート無 ステート有 ƒ ƒ x x x x s a a b c
  • 6. Compositing stateless functions ƒ g r p q s t ステート有 ƒ g r p q s t ステート無
  • 7. Functional Programming • ステートを持たない • 変数を変化させない ? • 関数はその手順よりも、どうあるべきか記述する • Value Oriented Programming* • 関数はValueとなる • マルチスレッドでハイパフォーマンスを期待できる * Swift Functional Programming
  • 8. Functional-ish class Counter { var counter = 0 func count(count: Int) { counter += count } } var counter = Counter() counter.count(7) counter.count(10) println(counter.counter) // 17 let list = ["c", "d", "a", "b"] var string = sorted(list) .map({$0.uppercaseString}) .reduce("") {$0 + $1} println(string) // "ABCD" Object Oriented 的 Functional 的
  • 9. Function Chaining • Unix の パイプのように、関数をつなげて、より高 度な目的をシンプルに達成可能 • 関数の動作が変数などに依存していると、関数を単 純につなげても副作用の恐れがある • グローバル変数に依存したコードの再利用が難し い構造に似ている
  • 10. Function without modifying data collection? • Array や Dictionary は コピーを使う var list1 = [1, 2, 3] var list2 = list1; // 参照ではなくコピー list2.append(4) var list3 = list2 // 参照ではなくコピー list3.append(5) println(list1) // 1,2,3 <- 変化なし println(list2) // 1,2,3,4 <- 変化なし println(list3) // 1,2,3,4,5 • 代入文では参照ではなくコピーされる • でもこれって値の変更じゃん!
  • 11. Ideally Immutable, but…
 • 関数やメソッド内の結果の影響をその範囲に限定させる • その関数内で変数を変更しても、その影響をプロパティ などに足跡として残さない • 変数を変更している最中に別スレッドから同じ関数が呼 ばれた場合でもお互いに影響させない • スレッドが別でもローカル変数は影響を受けない • @synchronized がいらなくなる?
  • 13. What is High Order Function? 高階関数(こうかいかんすう、英: higher-order function)とは、関数(手 続き)を引数にしたり、あるいは関数(手続き)を戻り値とするような関 数のことである。 (省略) 高階関数は関数を引数にしたり、あるいは関数を戻り値とするものであ り、引数や戻り値の関数もまた高階関数となり得る。高階関数は主に関数 型言語やその背景理論であるラムダ計算において多用される。 また、ある関数(手続き)の引数となる関数(手続き)のことを関数引数 [1]や手続き引数[2]と呼ぶこともある。 - Wikipedia, Ja
  • 14. High Order Function • 関数を引数に与える事ができる • 関数を戻り値できる
  • 15. map let inputs = [10.0, 20.0, 45.0] var outputs = [Double]() for value in inputs { outputs.append(value * 0.7) } println(outputs) // "[7.0, 14.0, 31.5]" let inputs = [10.0, 20.0, 45.0] var outputs = map(inputs, { x in x * 0.7}) println(outputs) // "[7.0, 14.0, 31.5]" [ x1, x2, ... , xn].map(f) -> [f(x1), f(x2), ... , f(xn)] *1 http://www.weheartswift.com *1
  • 16. {x in x} let outputs = map(inputs, { x in x * 0.7}) var outputs = [Double]() for x in inputs { outputs.append(x * 0.7) }
  • 17. filter • Dictionary の場合 • Array の場合 let inputs = ["Ken":64, "Joe":23, "Jack":32, "Alex":75] let outputs = filter(inputs, { key, value -> Bool in value < 40 }) println(outputs) // "[(Joe, 23), (Jack, 32)]" let inputs = [64, 23, 32, 75] let outputs = filter(inputs, { value -> Bool in value < 40 }) println(outputs) // "[23, 32]"
  • 19. 頭の体操 • Dictionary の Arrayから、それぞれの key に対す る値の和を求めた Dictionary を求めよ。 let outputs = reduce(inputs, [String:Int]()) { (a, b) in var d = a for (k, v) in b { d[k] = (d[k] ?? 0) + v } return d } println(outputs) // [e: 10, w: 7] e の和 と w の和を求める たぶん Functional な方 法があるにちがいない let inputs = [["e":5], ["w":4], ["e":3], ["w":3, "e": 2]]
  • 21. Currying カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関 数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残り の引数を取り結果を返す関数」であるような関数にすること(あるいはそ の関数のこと)である。 (略) ごく簡単な例として、f(a, b) = c という関数 f があるときに、F(a) = g(こ こで、g は g(b) = c となる関数である)という関数 F が、f のカリー化 である。 - Wikipedia, ja
  • 22. Currying In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes multiple arguments (or a tuple of arguments) into evaluating a sequence of functions, each with a single argument (partial application). It was introduced by Moses Schönfinkel and later developed by Haskell Curry. - Wikipedia, en
  • 24. Add • これまでの加算 func add(x: Int, y: Int) -> Int { return x + y } add(2, 3) // 5 • Functional ちっくな加算 func add(x: Int) -> (Int -> Int) { return { y in return x + y } } add(2)(3) // 5 let add2 = add(2) add2(3) // 5
  • 25. Currying https://github.com/typelift/swiftz/blob/master/swiftz/Curry.swift public func curry<A,B,C>(f: (A,B) -> C) -> A -> B -> C { return { a in { b in f(a,b) } } } public func curry<A,B,C,D>(f: (A,B,C) -> D) -> A -> B -> C -> D { return { a in { b in { c in f(a,b,c) } } } } public func curry<A,B,C,D,E>(f: (A,B,C,D) -> E) -> A -> B -> C -> D -> E return { a in { b in { c in { d in f(a,b,c,d) } } } } } curry(+)(100)(2) // 102 curry(+)("Hello, ")("World") // "Hello, World"
  • 26. What curry<A,B,C> 
 can do for you? func add(x: Int, y: Int) -> Int { return x + y } public func curry<A,B,C>(f: (A,B) -> C) -> A -> B -> C { return { a in { b in f(a,b) } } } curry(add)(100)(3) // 103 let add100 = curry(add)(100) add100(3) // 103
  • 27. What’s gonna happen to Object Oriented Programming? Are they going to extinct?
  • 28. User Interface • UIWindow, NSWindow は class なので参照! • Foundation ぽい所は Functional • UIやモデルなどプロパティやステートの更新を必要 とする部分は Object Oriented var window = UIWindow(frame: UIScreen.mainScreen().applicationFrame) window.backgroundColor = UIColor.whiteColor() // do not copy
  • 30. Wrap up • 複雑なコードを完結に書く事が可能 • 再現性が高くバグの少ないコードを書く事が可能 • 学習曲線がきついく、OOPで5分で書けるコードを 30分悩んで書く事も • Objective Oriented Programming も健在