Submit Search
Upload
Applicative Functors in Swift
•
10 likes
•
4,714 views
Kazuhiro Sakamoto
Follow
shibuya.swift #2 での発表資料です。
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 44
Download now
Download to read offline
Recommended
[Dots.]taiga
[Dots.]taiga
Tatsunori Nishikori
Sqlite
Sqlite
Yohei Sakakibara
リキッドレイアウトって何なのよ
リキッドレイアウトって何なのよ
Miho Matsui
はじめてのブログ論 Ver臼杵
はじめてのブログ論 Ver臼杵
Shoji Endo
情報システム部がSplunk を使うとどうなるか?
情報システム部がSplunk を使うとどうなるか?
snicker_jp
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
snicker_jp
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
SendGrid Parse APIをデモってみる
SendGrid Parse APIをデモってみる
Wataru Sato
Recommended
[Dots.]taiga
[Dots.]taiga
Tatsunori Nishikori
Sqlite
Sqlite
Yohei Sakakibara
リキッドレイアウトって何なのよ
リキッドレイアウトって何なのよ
Miho Matsui
はじめてのブログ論 Ver臼杵
はじめてのブログ論 Ver臼杵
Shoji Endo
情報システム部がSplunk を使うとどうなるか?
情報システム部がSplunk を使うとどうなるか?
snicker_jp
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
snicker_jp
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
SendGrid Parse APIをデモってみる
SendGrid Parse APIをデモってみる
Wataru Sato
Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)
Goichi Hirakawa
プログラミング初心者の壁の越え方
プログラミング初心者の壁の越え方
Yuichi Kato
SwiftにおけるClassとStructの使い分け
SwiftにおけるClassとStructの使い分け
Kazunobu Tasaka
Swift3.0に向けて enumerateを使い始めよう
Swift3.0に向けて enumerateを使い始めよう
Motoki Narita
iOS開発 本当にあった怖い話
iOS開発 本当にあった怖い話
Kazuhiro Sakamoto
誰でも出来るローカル開発環境の作り方
誰でも出来るローカル開発環境の作り方
666oh666
Eight meets Realm
Eight meets Realm
Kazuhiro Sakamoto
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Roy Kim
エンジニアのためのブログ勉強会(公開用)
エンジニアのためのブログ勉強会(公開用)
Kenji Tanaka
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
Itaru Kitagawa
実践 Redux Saga -Practical Redux Saga-
実践 Redux Saga -Practical Redux Saga-
Shinichiro Yoshida
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
20170302 tryswift tasting_tests
20170302 tryswift tasting_tests
Kazuaki Matsuo
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
小林 信行
Unity5とUE4の比較
Unity5とUE4の比較
Masahiko Nakamura
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
サービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechcon
DeNA
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
More Related Content
Viewers also liked
Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)
Goichi Hirakawa
プログラミング初心者の壁の越え方
プログラミング初心者の壁の越え方
Yuichi Kato
SwiftにおけるClassとStructの使い分け
SwiftにおけるClassとStructの使い分け
Kazunobu Tasaka
Swift3.0に向けて enumerateを使い始めよう
Swift3.0に向けて enumerateを使い始めよう
Motoki Narita
iOS開発 本当にあった怖い話
iOS開発 本当にあった怖い話
Kazuhiro Sakamoto
誰でも出来るローカル開発環境の作り方
誰でも出来るローカル開発環境の作り方
666oh666
Eight meets Realm
Eight meets Realm
Kazuhiro Sakamoto
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Roy Kim
エンジニアのためのブログ勉強会(公開用)
エンジニアのためのブログ勉強会(公開用)
Kenji Tanaka
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
Itaru Kitagawa
実践 Redux Saga -Practical Redux Saga-
実践 Redux Saga -Practical Redux Saga-
Shinichiro Yoshida
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
20170302 tryswift tasting_tests
20170302 tryswift tasting_tests
Kazuaki Matsuo
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
小林 信行
Unity5とUE4の比較
Unity5とUE4の比較
Masahiko Nakamura
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
サービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechcon
DeNA
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
Viewers also liked
(18)
Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)
プログラミング初心者の壁の越え方
プログラミング初心者の壁の越え方
SwiftにおけるClassとStructの使い分け
SwiftにおけるClassとStructの使い分け
Swift3.0に向けて enumerateを使い始めよう
Swift3.0に向けて enumerateを使い始めよう
iOS開発 本当にあった怖い話
iOS開発 本当にあった怖い話
誰でも出来るローカル開発環境の作り方
誰でも出来るローカル開発環境の作り方
Eight meets Realm
Eight meets Realm
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
エンジニアのためのブログ勉強会(公開用)
エンジニアのためのブログ勉強会(公開用)
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
実践 Redux Saga -Practical Redux Saga-
実践 Redux Saga -Practical Redux Saga-
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
20170302 tryswift tasting_tests
20170302 tryswift tasting_tests
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
Unity5とUE4の比較
Unity5とUE4の比較
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
サービスの成長を支えるフロントエンド開発 #denatechcon
サービスの成長を支えるフロントエンド開発 #denatechcon
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Applicative Functors in Swift
1.
Applicative Functors in Swift @kazu0620
2.
自己紹介 坂本 和大( @kazu0620
) Sansan株式会社 Eight事業部所属 過去に個人で開発したアプリ - 秘密のアルバム(40万DL!) - にゃんこ(15万DL!)
3.
はじめに
4.
Swift その2 Advent
Calendar 2015 • 「Optionalな文字列同士を良い感じに結合す る」という記事を書いた http://qiita.com/kazu0620/items/f2a6272c6b8b7bcbaa42
5.
• アプリカティブスタイルについてのコメント を@koher さんから頂いた!
6.
curry(+) <^> a
<*> b RunesとCurryというライブラリを利用すると上記の 様な表現が出来るとのこと!
7.
便利そうだが… • <*>とは? • curryって関数は何してるのか? •
<^>って何だろ? • 具体的に何がどう嬉しいのか?
8.
ので、調べてみた
9.
本日のゴール が何をしてるのか理解して、Runesでアプリカ ティブスタイルを使えるようになる! curry(+) <^> a
<*> b
10.
箱の話をしよう
11.
「文脈と値を持った箱」という ものがあるらしい • Optionalは箱(よく聞くやつ) • ArrayもOptionalと同じく箱(たまに聞くや つ) •
つまり...?
12.
reference: Functors, Applicatives,
And Monads In Pictures(最高の資料) http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html • 2(a)という「値」と、計算が失敗したかもしれな い(nilかもしれない)という「文脈」を持ってい る。
13.
reference: Functors, Applicatives,
And Monads In Pictures http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html • 箱に入った値に対して、関数を適用するには? • 箱から開けないと(unwrap)、関数を適用できな い
14.
箱を開けずに関数を適用する には?
15.
朗報 「箱」たちは、基本的にすべ て箱を開けずに値を操作する ための関数を持っている!
16.
map • mapは、箱を開けることなく値を操作するためのメ ソッド • さっきから「箱」と呼んでるものはこのmapという メソッドを備えている http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html reference:
Functors, Applicatives, And Monads In Pictures
17.
Fanctorとは?
18.
Fanctor • 実はすでにFanctorについては説明済み • さっきから言ってる「箱」
= Fanctor • Fanctorは、文脈(nilかもしれない…など)を持った値 • mapを使うと文脈を保ったまま関数を値に適用できる • 厳密には、Fanctor則と呼ばれるルールを満たす型のこと
19.
• mapを利用して、箱を開けることなく中の値 を操作できる。配列も同じ。 http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html reference: Functors,
Applicatives, And Monads In Pictures
20.
Applicative Functorとは?
21.
Applicative Functor • Fanctorのすごいやつ •
Swiftの場合は、言語仕様にはない。が、 Runesというライブラリを利用すれば実現で きる。 • 何ができるのか…?
22.
<*>
23.
<*>とApplicative Functor • Fanctorがmapを備えていたように、 Applicative
Functorは<*>を備えている • <*>は「箱に包まれた関数」と「箱に包まれ た値」を引数にとる
24.
<*>とApplicative Functor • 「箱に包まれた値」 •
「箱に包まれた関数?」 Optional(箱)の中にはクロージャだって格納できる
25.
<*>とApplicative Functor を に、箱を開けずに適用するには?
26.
<*>とApplicative Functor flatMap+mapでもできなくはないが… <*>を使った方がシンプル&わかりやすい! <*>は を
に適用している
27.
<*>とApplicative Functor http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html reference: Functors,
Applicatives, And Monads In Pictures Applicative Functorは、箱の中の関数を、箱 の中の値に適用してくれる!
28.
引数が複数ある関数 複数のOptional値に対して関数を適用したい とき<*>は便利! sumThreeElementsというOptionalではない値を引数 にとる関数をx, y, z(Optional)
に適用できてる! ・そして、さりげなく現れた「curry」
29.
引数が複数ある関数 curryは、Curryというライブラリのメソッ ド。これを呼び出さないと、 になる。<*>は「箱に包まれた関数」と「箱に 包まれた値」を引数にとる。 「箱に包まれた値」<*>「箱に包まれた値」
30.
引数が複数ある関数 これの返り値が関数であってほしい… 引数:x 返り値:yを引数とする関数(その返り値はzを引数 とする関数) にsumTreeElementsを変換することさえ出来れば…
31.
カリー化(高階関数) • 高階関数: 引数として関数をとったり返り値と して関数を返す関数 •
カリー化: 複数の引数をとる関数を、1つの引 数を取り、残りの引数をとる関数に定義を書 き換えること(多分)
32.
引数が複数ある関数 というわけで、Curryを利用してカリー化す ることで、複数の引数がある関数も適用でき るように! 返り値は「箱に包まれた関数」 返り値は「箱に包まれた関数」
33.
pure • +もカリー化して、<*>で繋げて書くことが出来る • pureは、.Someと同じ。「文脈を持った箱」のデ フォルト値で包む。 •
じゃ、.Someで良いじゃん?
34.
pure • xやyがOptional型とは限らない • アプリカティブスタイルは、アプリカティブ 則を満たす型なら何にでも適応できる •
pureを使っておけば中の値がArrayでも安心 同じ
35.
さらに • result1とresult2は同じ結果になる • このa.map(f)の記述は頻出なのでショートカットが用意 されている •
<^> !
36.
<^> • 上記の3つは、同じ処理 • <^>
を使うことで、(+)をxとyに適用するんだ ぞ、ということがわかりやすくなる
37.
というわけで
38.
curry(+) <^> a
<*> b • +という関数をカリー化し • Optionalのデフォルト値(.Some)でその関数を包み • <*>を使い、Optionalに包まれたaとbに、unrwap することなく+を適用している ※わかりやすさのためにOptionalと書いたが、アプリカティブ則を満たす型ならな んでも良い
39.
で、結局何が便利なの?
40.
アプリカティブスタイルのメリット • Optionalでない値を取る関数も、Unwrapせず にOptionalに適用できる • 複数のOptionalをUnwrapすることなく計算で きる •
プロダクトで使ってみて、他良いとこあったら共 有します!
41.
Functor, Applicative, そしてMonadについてもっと知り たい方は…
42.
We're hiring! • Sansan株式会社では、Swiftを書くのが好きなエ ンジニアを絶賛募集中 •
Kotlin好きなandoridエンジニアも絶賛募集中 • React.jsをゴリゴリ書きたいフロントエンジニア も • ruby/C#なエンジニアも!
43.
We're hiring! • 興味あれば、
wantedlyか会社の採用ページから 応募を! • https://www.wantedly.com/companies/ Sansan/projects • http://jp.corp-sansan.com/recruit/job/ index.html • (@kazu0620にコッソリ連絡くれる、でもOK)
44.
ご静聴ありがとうございました
Download now