すごいHaskellたのしく学ぼう!を読み終えて
すごいHaskellたのしく学ぼう!(以下すごいH本)を何とか読み終えることができたので感想を書いてみたいと思います。理解できていない所は多々ありますが・・・。
モチベーション
まず、なぜHaskellを学んでみようと思ったかというとCodeWarsやプログラミングコンテストを普段使っている以外の言語で解いてみたくなったからです。
「Java, Kotlinで書いてるけど普段から使ってる言語だから新鮮味がないなぁ」
「今まで使ったことがない言語で問題を解けば学びが多くなるかもしれない」
「プログラミングパラダイムも変えればさらに学びが多いのでは」
「前職の同僚がHaskellで面白そうな本持ってたなぁ。Haskellやってみるか」
という流れです。
本の内容
Haskell初心者向けに書かれた本だと思うのですが、自分にとっては十分難しく特に後半の進みが遅くなった印象があります。
Haskellでコードを書いてみた感想
すごいH本を写経したりCodeWarsの簡単な問題をHaskellで解いたりしていたのですが、一言で言うと窮屈な感じがしました。これは普段使っている言語とのプログラミングパラダイムの違いかと思います。最初は書きづらすぎてイライラしてましたが、慣れてくるとHaskell(関数型言語)の方が可読性の高い書き方ができる(可読性の高い書き方を強制される)ような感じました。
手続き型で書けないことが辛すぎるのであればdo記法というコードを上から手続き型のように書ける機能が用意されています。すごいH本を読み進めていくと実はdo記法を使うとHaskellで手続き型の記法が使えるということではなく、上から順に書いたコードをモナドという概念として扱いそれらをバインドする構文糖衣がdoだったのだ!という展開が待っていて地味に感動しました。
難しく感じた所
個人的な躓きポイントとしては主に下記2つ
- 割り算
- ファンクタ、アプリカティブ、モナド
IntをIntで割ったらキャストされて戻り値もIntでしょ?と思ってると自分と同じようにハマる可能性があります。Haskellでは割り算の戻り値はFractional型で返ってきてIntで受け取ろうとすると怒られます。後者はほぼ理解できていなくて、データに文脈を与える何かであるようなのですが、まだ説明できるほど自分の中で噛み砕けていないのが現状です。
Next Action
いつぞやのDroidKaigiで見かけて知ったのですが、Kotlinで関数型のコードが書ける[Arrow](https://arrow-kt.io/)というライブラリがあります。これを扱えるようになれば関数型のコードをAndroidアプリで書けるようになりより可読性の高く、疎結合・高凝集度のコードが書けるのでは?と思いそっちに進んでみようかと思ってます。
Arrowを使ってみてどうだったかはまたブログで紹介する予定です。(多分)