Download - Applicative Functors in Swift
Swift その2 Advent Calendar 2015
• 「Optionalな文字列同士を良い感じに結合する」という記事を書いた
http://qiita.com/kazu0620/items/f2a6272c6b8b7bcbaa42
reference: Functors, Applicatives, And Monads In Pictures(最高の資料)
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
• 2(a)という「値」と、計算が失敗したかもしれない(nilかもしれない)という「文脈」を持っている。
reference: Functors, Applicatives, And Monads In Pictureshttp://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
• 箱に入った値に対して、関数を適用するには?
• 箱から開けないと(unwrap)、関数を適用できない
map
• mapは、箱を開けることなく値を操作するためのメソッド
• さっきから「箱」と呼んでるものはこのmapというメソッドを備えている
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.htmlreference: Functors, Applicatives, And Monads In Pictures
Fanctor
• 実はすでにFanctorについては説明済み
• さっきから言ってる「箱」 = Fanctor
• Fanctorは、文脈(nilかもしれない…など)を持った値
• mapを使うと文脈を保ったまま関数を値に適用できる
• 厳密には、Fanctor則と呼ばれるルールを満たす型のこと
• mapを利用して、箱を開けることなく中の値を操作できる。配列も同じ。
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.htmlreference: Functors, Applicatives, And Monads In Pictures
<*>とApplicative Functor
• Fanctorがmapを備えていたように、Applicative Functorは<*>を備えている
• <*>は「箱に包まれた関数」と「箱に包まれた値」を引数にとる
<*>とApplicative Functor
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.htmlreference: Functors, Applicatives, And Monads In Pictures
Applicative Functorは、箱の中の関数を、箱の中の値に適用してくれる!
引数が複数ある関数複数のOptional値に対して関数を適用したいとき<*>は便利!
sumThreeElementsというOptionalではない値を引数にとる関数をx, y, z(Optional) に適用できてる!
・そして、さりげなく現れた「curry」
引数が複数ある関数curryは、Curryというライブラリのメソッド。これを呼び出さないと、
になる。<*>は「箱に包まれた関数」と「箱に包まれた値」を引数にとる。
「箱に包まれた値」<*>「箱に包まれた値」
curry(+) <^> a <*> b
• +という関数をカリー化し
• Optionalのデフォルト値(.Some)でその関数を包み
• <*>を使い、Optionalに包まれたaとbに、unrwap
することなく+を適用している
※わかりやすさのためにOptionalと書いたが、アプリカティブ則を満たす型ならなんでも良い
アプリカティブスタイルのメリット
• Optionalでない値を取る関数も、UnwrapせずにOptionalに適用できる
• 複数のOptionalをUnwrapすることなく計算できる
• プロダクトで使ってみて、他良いとこあったら共有します!
We're hiring!
• Sansan株式会社では、Swiftを書くのが好きなエンジニアを絶賛募集中
• Kotlin好きなandoridエンジニアも絶賛募集中
• React.jsをゴリゴリ書きたいフロントエンジニアも
• ruby/C#なエンジニアも!
We're hiring!
• 興味あれば、 wantedlyか会社の採用ページから応募を!
• https://www.wantedly.com/companies/Sansan/projects
• http://jp.corp-sansan.com/recruit/job/index.html
• (@kazu0620にコッソリ連絡くれる、でもOK)