SlideShare a Scribd company logo
Swiftでの関数型プログラミングについて
考えていること
@akio0911
参考になる書籍
http://www.amazon.co.jp/dp/4274068854
参考になる書籍
http://www.amazon.co.jp/dp/B00UY3K04O
Multi-paradigm
Swift is a multi-paradigm, compiled programming
language created by Apple Inc. for iOS, OS X, and
watchOS development.
https://en.wikipedia.org/wiki/Swift_(programming_language)
Multi-paradigm
• Object-oriented programming
• Protocol-oriented programming
• Functional programming
関数型プログラミングの特徴
• コード量が少なくなる
• 最適化がしやすい
• 並行/並列化がしやすい
• バグり/バグらせにくい
• ドキュメントが少なくなる
引用元 : 関数プログラミング実践入門 4ページ
純粋関数型プログラミング言語
Haskell
• 「何をするか」ではなく「何であるか」を伝える
• 一度変数の値を設定すると、後でそれを別の値に変更することはできない
• 関数は副作用を持たない(参照透明性)
• 遅延評価
• 静的型付け言語
• 型推論
• エレガントで簡潔
「何をするか」ではなく
「何であるか」を伝える
CPUで行っていることと一対一で対応している
「何をするか」ではなく
「何であるか」を伝える
「合計とは何か?」を書く
合計とは「1個目の数値 + 残りの要素の合計」である
要素数0の配列の合計は0である
sum2([1, 2, 3, 4, 5])
1 + sum2([2, 3, 4, 5])
1 + (2 + sum2([3, 4, 5]))
1 + (2 + (3 + sum2([4, 5])))
1 + (2 + (3 + (4 + sum2([5]))))
1 + (2 + (3 + (4 + (5 + sum2([])))))
1 + (2 + (3 + (4 + (5 + 0))))
1 + (2 + (3 + (4 + 5)))
1 + (2 + (3 + 9))
1 + (2 + 12)
1 + 14
15
reduce
パックマン的な処理を書くための汎用的な処理
0
1 2 3 4 50 + 1 -> 1
1
2 3 4 51 + 2 -> 3
3
3 4 53 + 3 -> 6
6
4 56 + 4 -> 10
10
510 + 5 -> 15
15
・パックマンの初期値
・パックマンに食わせるコレクション
・パックマンが食った後の新たなacc
を指定できるのがreduce
acc num new acc rest
0 1 0 + 1 -> 1 [2, 3, 4, 5]
1 2 1 + 2 -> 3 [3, 4, 5]
3 3 3 + 3 -> 6 [4, 5]
6 4 6 + 4 -> 10 [5]
10 5 10 + 5 -> 15 []
reduce
パックマンをイメージすると、分かりやすく見えてくる
一度変数の値を設定すると、

後でそれを別の値に変更することはできない
varのデメリット
var a = 10
様々な処理
let result = function(a)
functionに何が渡されるかは
ここをすべて読まないと断定できない
letのメリット
let a = 10
様々な処理
let result = function(a)
ここだけ読めば、
functionに何が渡されるかが断定できる
mutating keyword
structではプロパティを書き換える場合はmutatingが必要
(classの場合は不要)
varにしないといけない
mutating keyword
• 構造体を「データの入れ物(状態変化を伴う)」
ではなく、「構造を持つ1個のデータ」と考えて
いるっぽい
• classはreference typeで状態を持つ。structは
value typeで状態を持たない、という扱いをす
ると良さそう
状態を変化させず
新たなデータを生成する
Swiftではletを使え!というメッセージを
ここからも感じる
letでOK!
Swiftではletを使え!というメッセージをここからも感じる
Higher-order function
引用元 : Functional programming in Swift
Higher-order function
座標を渡すと、それが領域内に含まれているか否かを
Boolで返してくれる関数型を定義
これが意味深!
Higher-order function
関数のインターフェースさえ えれば
部品として組み合わせられる。
クラスの継承などは部品として大げさな場合がある?
Higher-order function
関数のインターフェースが っているので
部品としてかなり自由に組み合わせられる
Operatorを定義すると便利に書ける
ここらへんが微妙?強制アンラップしないと、
失敗する可能性のある処理を、次の処理につなげられない
失敗する可能性のある処理を
つなげられる演算子
参考 : http://qiita.com/koher/items/
95583f58a443f6a33c28
失敗する可能性のある処理を作る
失敗する可能性のある処理をつなげる
Optional Chain(a?.b?.c)の関数版?
エラーを処理するif文などが不要になった。
失敗する可能性のある処理を2つ合成して
失敗する可能性のある処理を1つ作る演算子
失敗する可能性がある関数を部品としてつなげ合わせて
新しい部品を作れるようになった
まとめ
• 「何をするか」ではなく「何であるか」を書く
• reduceは汎用的に使えるパックマン
• 極力letを使って、追いかけやすい(追いかけなく
ても良い)コードを目指そう
• 高階関数を使えば非常に柔軟に書ける(クラスは部
品の実現方法として大げさな場合がある?)
• 失敗する可能性のある処理をそのまま扱えると便利

More Related Content

What's hot

Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
Kouji Matsui
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
Fujio Kojima
 
Kotlinについて学んだコト
Kotlinについて学んだコトKotlinについて学んだコト
Kotlinについて学んだコト
iPride Co., Ltd.
 
CoreDataでのsubqueryの使い方
CoreDataでのsubqueryの使い方CoreDataでのsubqueryの使い方
CoreDataでのsubqueryの使い方
Masaru Ichikawa
 
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべてApple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
Masaru Gushiken
 
関数型Swift
関数型Swift関数型Swift
関数型Swift
S_Shimotori
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式
Kouji Matsui
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
Kouji Matsui
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
Kouji Matsui
 
KLabの社内勉強会紹介
KLabの社内勉強会紹介KLabの社内勉強会紹介
KLabの社内勉強会紹介
KLab Inc. / Tech
 
iOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバiOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバ
Syo Ikeda
 
Carthageについて知りたいn個のこと
Carthageについて知りたいn個のことCarthageについて知りたいn個のこと
Carthageについて知りたいn個のこと
Syo Ikeda
 
How to improve Type-safety in your Objective-C code
How to improve Type-safety in your Objective-C codeHow to improve Type-safety in your Objective-C code
How to improve Type-safety in your Objective-C code
Chiharu Nameki
 
Api設計のつぶやき
Api設計のつぶやきApi設計のつぶやき
Api設計のつぶやき
xyzplus_net
 
開発チームにKotlinを導入した話
開発チームにKotlinを導入した話開発チームにKotlinを導入した話
開発チームにKotlinを導入した話
Hiroshi Kikuchi
 
Hello! intermediate language
Hello! intermediate languageHello! intermediate language
Hello! intermediate language
Kouji Matsui
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions III
Kouji Matsui
 
Himotoki: A type-safe JSON decoding library #関モバ
Himotoki: A type-safe JSON decoding library #関モバHimotoki: A type-safe JSON decoding library #関モバ
Himotoki: A type-safe JSON decoding library #関モバ
Syo Ikeda
 
PHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについて
PHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについてPHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについて
PHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについて
ssusered4a9d
 
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
TATSUYA HAYAMIZU
 

What's hot (20)

Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
 
Kotlinについて学んだコト
Kotlinについて学んだコトKotlinについて学んだコト
Kotlinについて学んだコト
 
CoreDataでのsubqueryの使い方
CoreDataでのsubqueryの使い方CoreDataでのsubqueryの使い方
CoreDataでのsubqueryの使い方
 
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべてApple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
 
関数型Swift
関数型Swift関数型Swift
関数型Swift
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
KLabの社内勉強会紹介
KLabの社内勉強会紹介KLabの社内勉強会紹介
KLabの社内勉強会紹介
 
iOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバiOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバ
 
Carthageについて知りたいn個のこと
Carthageについて知りたいn個のことCarthageについて知りたいn個のこと
Carthageについて知りたいn個のこと
 
How to improve Type-safety in your Objective-C code
How to improve Type-safety in your Objective-C codeHow to improve Type-safety in your Objective-C code
How to improve Type-safety in your Objective-C code
 
Api設計のつぶやき
Api設計のつぶやきApi設計のつぶやき
Api設計のつぶやき
 
開発チームにKotlinを導入した話
開発チームにKotlinを導入した話開発チームにKotlinを導入した話
開発チームにKotlinを導入した話
 
Hello! intermediate language
Hello! intermediate languageHello! intermediate language
Hello! intermediate language
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions III
 
Himotoki: A type-safe JSON decoding library #関モバ
Himotoki: A type-safe JSON decoding library #関モバHimotoki: A type-safe JSON decoding library #関モバ
Himotoki: A type-safe JSON decoding library #関モバ
 
PHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについて
PHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについてPHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについて
PHP5→PHP7にバージョンアップをするに あたって実感した Docker 導入の素晴らしさについて
 
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
 

Similar to Swiftでの関数型プログラミングについて考えていること

Flang kkd1
Flang kkd1Flang kkd1
Flang kkd1
florets1
 
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
Takashi Sogabe
 
Non-Functional Programming in Scala
Non-Functional Programming in ScalaNon-Functional Programming in Scala
Non-Functional Programming in Scala
takezoe
 
Kaleidox
KaleidoxKaleidox
Kaleidox
Tomoharu ASAMI
 
iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?
Toshio Ehara
 
WikiWikiアジャイル
WikiWikiアジャイルWikiWikiアジャイル
WikiWikiアジャイル
Fumio Kawakami
 
Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~
Yuto Suzuki
 
Practical Use of Provisioning Profile 20140115 potatotips3
Practical Use of Provisioning Profile 20140115 potatotips3Practical Use of Provisioning Profile 20140115 potatotips3
Practical Use of Provisioning Profile 20140115 potatotips3
Shin Yamamoto
 
パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"
Keisuke Takahashi
 
オフラインファーストの思想と実践
オフラインファーストの思想と実践オフラインファーストの思想と実践
オフラインファーストの思想と実践
Shumpei Shiraishi
 
Scala採用の背景とその後 @ hitomedia night #5
Scala採用の背景とその後 @ hitomedia night #5Scala採用の背景とその後 @ hitomedia night #5
Scala採用の背景とその後 @ hitomedia night #5
Jiro Hiraiwa
 
iOSローカライズことはじめ
iOSローカライズことはじめiOSローカライズことはじめ
iOSローカライズことはじめ
俊輔 嶺村
 
Adobe JSX入門
Adobe JSX入門Adobe JSX入門
Adobe JSX入門
silvers ofsilvers
 
Fn project爆誕
Fn project爆誕Fn project爆誕
Fn project爆誕
Hiroshi Hayakawa
 
iOS開発でのおすすめライブラリと管理
iOS開発でのおすすめライブラリと管理iOS開発でのおすすめライブラリと管理
iOS開発でのおすすめライブラリと管理
Tomoya Hayakawa
 
PHP フィールドインジェクションに挑戦する PHP勉強会2014
PHP フィールドインジェクションに挑戦する PHP勉強会2014PHP フィールドインジェクションに挑戦する PHP勉強会2014
PHP フィールドインジェクションに挑戦する PHP勉強会2014
Yuuki Takezawa
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
Tomoki Hasegawa
 
Swift bondさわってみた
Swift bondさわってみたSwift bondさわってみた
Swift bondさわってみた
Motoki Narita
 
Lombok ハンズオン
Lombok ハンズオンLombok ハンズオン
Lombok ハンズオン
Hiroto Yamakawa
 

Similar to Swiftでの関数型プログラミングについて考えていること (20)

Flang kkd1
Flang kkd1Flang kkd1
Flang kkd1
 
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
 
Non-Functional Programming in Scala
Non-Functional Programming in ScalaNon-Functional Programming in Scala
Non-Functional Programming in Scala
 
Kaleidox
KaleidoxKaleidox
Kaleidox
 
iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?
 
WikiWikiアジャイル
WikiWikiアジャイルWikiWikiアジャイル
WikiWikiアジャイル
 
Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~
 
Practical Use of Provisioning Profile 20140115 potatotips3
Practical Use of Provisioning Profile 20140115 potatotips3Practical Use of Provisioning Profile 20140115 potatotips3
Practical Use of Provisioning Profile 20140115 potatotips3
 
パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"
 
オフラインファーストの思想と実践
オフラインファーストの思想と実践オフラインファーストの思想と実践
オフラインファーストの思想と実践
 
Scala採用の背景とその後 @ hitomedia night #5
Scala採用の背景とその後 @ hitomedia night #5Scala採用の背景とその後 @ hitomedia night #5
Scala採用の背景とその後 @ hitomedia night #5
 
iOSローカライズことはじめ
iOSローカライズことはじめiOSローカライズことはじめ
iOSローカライズことはじめ
 
Adobe JSX入門
Adobe JSX入門Adobe JSX入門
Adobe JSX入門
 
Fn project爆誕
Fn project爆誕Fn project爆誕
Fn project爆誕
 
iOS開発でのおすすめライブラリと管理
iOS開発でのおすすめライブラリと管理iOS開発でのおすすめライブラリと管理
iOS開発でのおすすめライブラリと管理
 
Swift入門
Swift入門Swift入門
Swift入門
 
PHP フィールドインジェクションに挑戦する PHP勉強会2014
PHP フィールドインジェクションに挑戦する PHP勉強会2014PHP フィールドインジェクションに挑戦する PHP勉強会2014
PHP フィールドインジェクションに挑戦する PHP勉強会2014
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
Swift bondさわってみた
Swift bondさわってみたSwift bondさわってみた
Swift bondさわってみた
 
Lombok ハンズオン
Lombok ハンズオンLombok ハンズオン
Lombok ハンズオン
 

Swiftでの関数型プログラミングについて考えていること