Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Applicative Functors in Swift

3,884 views

Published on

shibuya.swift #2 での発表資料です。

Published in: Engineering
  • Be the first to comment

Applicative Functors in Swift

  1. 1. Applicative Functors in Swift @kazu0620
  2. 2. 自己紹介 坂本 和大( @kazu0620 ) Sansan株式会社 Eight事業部所属 過去に個人で開発したアプリ - 秘密のアルバム(40万DL!) - にゃんこ(15万DL!)
  3. 3. はじめに
  4. 4. Swift その2 Advent Calendar 2015 • 「Optionalな文字列同士を良い感じに結合す る」という記事を書いた http://qiita.com/kazu0620/items/f2a6272c6b8b7bcbaa42
  5. 5. • アプリカティブスタイルについてのコメント を@koher さんから頂いた!
  6. 6. curry(+) <^> a <*> b RunesとCurryというライブラリを利用すると上記の 様な表現が出来るとのこと!
  7. 7. 便利そうだが… • <*>とは? • curryって関数は何してるのか? • <^>って何だろ? • 具体的に何がどう嬉しいのか?
  8. 8. ので、調べてみた
  9. 9. 本日のゴール が何をしてるのか理解して、Runesでアプリカ ティブスタイルを使えるようになる! curry(+) <^> a <*> b
  10. 10. 箱の話をしよう
  11. 11. 「文脈と値を持った箱」という ものがあるらしい • Optionalは箱(よく聞くやつ) • ArrayもOptionalと同じく箱(たまに聞くや つ) • つまり...?
  12. 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. 13. reference: Functors, Applicatives, And Monads In Pictures http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html • 箱に入った値に対して、関数を適用するには? • 箱から開けないと(unwrap)、関数を適用できな い
  14. 14. 箱を開けずに関数を適用する には?
  15. 15. 朗報 「箱」たちは、基本的にすべ て箱を開けずに値を操作する ための関数を持っている!
  16. 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. 17. Fanctorとは?
  18. 18. Fanctor • 実はすでにFanctorについては説明済み • さっきから言ってる「箱」 = Fanctor • Fanctorは、文脈(nilかもしれない…など)を持った値 • mapを使うと文脈を保ったまま関数を値に適用できる • 厳密には、Fanctor則と呼ばれるルールを満たす型のこと
  19. 19. • mapを利用して、箱を開けることなく中の値 を操作できる。配列も同じ。 http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html reference: Functors, Applicatives, And Monads In Pictures
  20. 20. Applicative Functorとは?
  21. 21. Applicative Functor • Fanctorのすごいやつ • Swiftの場合は、言語仕様にはない。が、 Runesというライブラリを利用すれば実現で きる。 • 何ができるのか…?
  22. 22. <*>
  23. 23. <*>とApplicative Functor • Fanctorがmapを備えていたように、 Applicative Functorは<*>を備えている • <*>は「箱に包まれた関数」と「箱に包まれ た値」を引数にとる
  24. 24. <*>とApplicative Functor • 「箱に包まれた値」 • 「箱に包まれた関数?」 Optional(箱)の中にはクロージャだって格納できる
  25. 25. <*>とApplicative Functor を に、箱を開けずに適用するには?
  26. 26. <*>とApplicative Functor flatMap+mapでもできなくはないが… <*>を使った方がシンプル&わかりやすい! <*>は を に適用している
  27. 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. 28. 引数が複数ある関数 複数のOptional値に対して関数を適用したい とき<*>は便利! sumThreeElementsというOptionalではない値を引数 にとる関数をx, y, z(Optional) に適用できてる! ・そして、さりげなく現れた「curry」
  29. 29. 引数が複数ある関数 curryは、Curryというライブラリのメソッ ド。これを呼び出さないと、 になる。<*>は「箱に包まれた関数」と「箱に 包まれた値」を引数にとる。 「箱に包まれた値」<*>「箱に包まれた値」
  30. 30. 引数が複数ある関数 これの返り値が関数であってほしい… 引数:x 
 返り値:yを引数とする関数(その返り値はzを引数 とする関数) にsumTreeElementsを変換することさえ出来れば…
  31. 31. カリー化(高階関数) • 高階関数: 引数として関数をとったり返り値と して関数を返す関数 • カリー化: 複数の引数をとる関数を、1つの引 数を取り、残りの引数をとる関数に定義を書 き換えること(多分)
  32. 32. 引数が複数ある関数 というわけで、Curryを利用してカリー化す ることで、複数の引数がある関数も適用でき るように! 返り値は「箱に包まれた関数」 返り値は「箱に包まれた関数」
  33. 33. pure • +もカリー化して、<*>で繋げて書くことが出来る • pureは、.Someと同じ。「文脈を持った箱」のデ フォルト値で包む。 • じゃ、.Someで良いじゃん?
  34. 34. pure • xやyがOptional型とは限らない • アプリカティブスタイルは、アプリカティブ 則を満たす型なら何にでも適応できる • pureを使っておけば中の値がArrayでも安心 同じ
  35. 35. さらに • result1とresult2は同じ結果になる • このa.map(f)の記述は頻出なのでショートカットが用意 されている • <^> !
  36. 36. <^> • 上記の3つは、同じ処理 • <^> を使うことで、(+)をxとyに適用するんだ ぞ、ということがわかりやすくなる
  37. 37. というわけで
  38. 38. curry(+) <^> a <*> b • +という関数をカリー化し • Optionalのデフォルト値(.Some)でその関数を包み • <*>を使い、Optionalに包まれたaとbに、unrwap することなく+を適用している ※わかりやすさのためにOptionalと書いたが、アプリカティブ則を満たす型ならな んでも良い
  39. 39. で、結局何が便利なの?
  40. 40. アプリカティブスタイルのメリット • Optionalでない値を取る関数も、Unwrapせず にOptionalに適用できる • 複数のOptionalをUnwrapすることなく計算で きる • プロダクトで使ってみて、他良いとこあったら共 有します!
  41. 41. Functor, Applicative, そしてMonadについてもっと知り たい方は…
  42. 42. We're hiring! • Sansan株式会社では、Swiftを書くのが好きなエ ンジニアを絶賛募集中 • Kotlin好きなandoridエンジニアも絶賛募集中 • React.jsをゴリゴリ書きたいフロントエンジニア も • ruby/C#なエンジニアも!
  43. 43. We're hiring! • 興味あれば、 wantedlyか会社の採用ページから 応募を! • https://www.wantedly.com/companies/ Sansan/projects • http://jp.corp-sansan.com/recruit/job/ index.html • (@kazu0620にコッソリ連絡くれる、でもOK)
  44. 44. ご静聴ありがとうございました

×