Rustを学習してからHaskellを学ぶと理解しやすい
というポジショントーク(?)。タイトルは「手続き型言語をやってきた人には」と付けたほうがいいかも。
この週末、「すごいHaskellたのしく学ぼう!」を読み直していました。
- 作者:MiranLipovaca
- 発売日: 2017/07/14
- メディア: Kindle版
最初に読んだのはたしか2018年初めだったと思います。10年ぐらいまともにプログラミングしていない状態から読んだので、Haskell独特の表現にかなり苦労しました。たとえば、
- 型クラス(
Eq
,Show
など) - データ型(
data Bool = True | False
など) - 型変数の表現(
head :: [a] > a
) - 型引数(
Maybe a = Just a | Nothing
のa
)
などなど。
そもそもの知識がC、Java、Rubyぐらいしかない状態で読んだので、「型引数をとる型で別の型をラップして、fmap
などで中の値にだけ関数を作用させる」ということがすごく高尚なことに思えて。それはなんとなく「難しいことをやってる」感を持つにはいいけどあまり理解はしていなかったように今では感じます。
さてそんな私ですが、2年ほどRustを学んで仕事でも使うようになり、Rustの言語仕様には慣れてきました。そこで久しぶりにこの本を読み返してみると「これはRustでいう○○だな!」というふうに理解しやすくなっていました。
- 型クラスはトレイトを
derive
するってことか - データ型は
enum
そのものだ - 型変数はRustでいう関数のシグネチャに似てるし、型制約は(Rustの)
where
句で表現しているやつ Maybe a
型はOption<T>
と同じ意味か
Rustは元々Haskellの影響を受けているので上記は当然かもですが、手続き型言語のパラダイムしか身についていなかった私には、RustをやってからHaskellを読むのが合っていたようです。Haskellは関数・引数・型の表現にあまり括弧を使わない言語仕様であるからか、慣れにくいところはあるかもしれません。Rustは記法として括弧をよく使うため、それらの関係性が見た目にもわかりやすかったのです。
いやまぁ、ぶっちゃけるとRustだけではなくて、ここ2年ぐらいでいろいろなプログラミング言語を学習してきたおかげが一番大きいのかもしれませんが。