Functional Programming in Swiftを読むために、すごいH本を読み終えた感想

公開日: : 最終更新日:2016/02/10 iOSアプリ開発

20150909-225806.jpg

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は「マルチパラダイム言語」とされているので、オブジェクト指向プログラミングと関数型プログラミングを混ぜてコードを組み立てていくこともできるはずです。

興味のある方はぜひ読んでみてください。新しい発見と刺激の連続が待っていますよ!

この記事を書いた人
あきお(@akio0911
iOSエンジニア、ブロガー。「プログラミングで人々を幸せに」をテーマに活動中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。 MAMORIO株式会社 技術顧問(インタビュー記事)、VISITS Technologies株式会社 技術顧問(インタビュー記事)。ブログ「卵は世界である」を運営。

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

【東京・銀座】粋華男(イケメン)製作所さんでメンズマツエクやメンズメイクなどを体験してきた

代表の手塚拓海さんからお誘いをいただき、粋華男(イケメン)

【入門】プログラム・プログラミング・プログラミング言語とは?

こんにちは、@akio0911です。 今回は「プログラム」「プロ

【入門】プログラミング未経験者向けのプログラミング入門連載記事を始めます

こんにちは、@akio0911です。 これからプログラミング未経

【RxSwift】BehaviorRelayとPublishRelayについてまとめてみた

こんにちは、@akio0911です。今回はRxSwiftのBe

【RxSwift】materialize, dematealizeを使ってみた

@toshi0383さんに教えていただいた、RxSwiftのm

→もっと見る

PAGE TOP ↑