Functional Programming in Swiftを読むために、すごいH本を読み終えた感想
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
「Functional Programming in Swift」という本がありまして、
この本を読めばSwiftにおける関数型プログラミングが分かるぞ!という話を聞きました。
ただ、僕は関数型プログラミングにあまり触れたことが無いですし、しかもこの本は英語で書かれています。自分が知らないことについて書かれている英語の本を読むのってかなりしんどいです。
そこでまずは純粋関数型プログラミング言語について書かれている「すごいHaskellたのしく学ぼう!」という本を読み始めた(そして読み終えた)んですが、その感想について書きたいと思います。
実は最初は「関数プログラミング実践入門」を読み始めたが・・・
実は最初は「関数プログラミング実践入門 ──簡潔で、正しいコードを書くために」という本を読み始めたんです。
しかしこの本は「Haskellのコードをどんどん書いていきましょう!」という形式ではなく、Haskellなどの関数型プログラミング言語の理論的な部分について淡々と解説していくような本でした。
Haskellなどの関数型プログラミング言語にあまり触れたことのない僕のような人間にとってはちょっときついと感じる本でして、途中で読むのをやめてしまいました。
(ただし、「すごいHaskellたのしく学ぼう!」を読み終えた今なら楽しく読めるのではないかと感じています。なので、後日また再チャレンジしてみようかなと思ってます。)
「すごいHaskellたのしく学ぼう!」を読み始めたら、Haskellが楽しくなってきた!
そこで、周りの人から高い評価を得ていた「すごいHaskellたのしく学ぼう!」を読み始めました。
「関数プログラミング実践入門」とは異なり、とにかくHaskellのコードを書いて、動かしてみて、その動作と意味について徐々に解き明かしていく。
「関数型プログラミング」という今まであまり触れたことのない考え方、思想を理解していく楽しさ、そして喜び。気が付けば、この本を読み進めていくのが生活における最優先事項となっていることに気付きました。
これは本当です。iOS関連のもくもく会や家ではずっと読んでコードを書いていたし、Haskellもくもく会に参加したりもしたし、移動中はiPad miniでこの本をずっと読んでいました。
HaskellのMaybeやEitherを学ぶことで、SwiftのOptionalやResultsを別の観点から見ることができるようになったし、なぜSwiftにおいてOptionalとArrayにmapというメソッドがあるのかも分かるようになりました(しかも今では、この2つが動作的にも同じものに見える!)。
Swiftのreduceについても「配列の合計を求めるときくらいにしか使えないなあ」くらいに思っていたんですが、今では「reduceすごい!っていうかfoldl/foldr(Haskellにおけるreduceみたいなもの)すごい!」と思うようになりました。
そして「Functional Programming in Swift」を読み始めた
そしてようやく本来の目的である「Functional Programming in Swift」を読み始めたわけですが、
5章まで読んで、既に面白すぎて止まらなくなってます(笑)。2章ではいきなり
typealias Region = Position -> Bool func circle(radius: Distance) -> Region { return { point in sqrt(point.x * point.x + point.y * point.y) <= radius } }
なんていう、以前の僕だったら「え???」って思うようなコードを書き始めるわけですが、「すごいHaskellたのしく学ぼう!」を読み終えた今ではとても自然なコードに見えるようになりました。circleが関数を返すようにすることで、この後とても柔軟にコードを組み立てていくことができるようになるのです!
また、4章では
typealias Filter = CIImage -> CIImage func blur(radius: Double) -> Filter { return { image in let parameters = [ kCIInputRadiusKey: radius, kCIInputImageKey: image ] let filter = CIFilter(name: "CIGaussianBlue" withInputParameters: parameters) return filter.outputImage } }
というコードが出てきた後に
infix operator >>> { associativity left } func >>> (filter1: Filter, filter2: Filter) -> Filter { return { img in filter2(filter1(img)) } }
なんていう演算子が出てくることで、
let myFilter2 = blur(blurRadius) >>> colorOverlay(overlayColor) let result2 = myFilter2(image)
としてフィルタを組み立てられる!分かりやすくて便利!と感じるようになりました。
@akio0911はこう思った。
オブジェクト指向言語に長く触れてきた人にとっては、「すごいHaskellたのしく学ぼう!」を読むことで関数型プログラミングという「コードを組み立てる他の方法」を学べる利点があると思います。
Swiftは「マルチパラダイム言語」とされているので、オブジェクト指向プログラミングと関数型プログラミングを混ぜてコードを組み立てていくこともできるはずです。
興味のある方はぜひ読んでみてください。新しい発見と刺激の連続が待っていますよ!
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!