にたまごほうれん草ブログ

はてなダイアリーから移行したブログ。以前のはこちら→http://d.hatena.ne.jp/emergent/

Rustを学習してからHaskellを学ぶと理解しやすい

というポジショントーク(?)。タイトルは「手続き型言語をやってきた人には」と付けたほうがいいかも。

この週末、「すごいHaskellたのしく学ぼう!」を読み直していました。

最初に読んだのはたしか2018年初めだったと思います。10年ぐらいまともにプログラミングしていない状態から読んだので、Haskell独特の表現にかなり苦労しました。たとえば、

  • 型クラス(Eq, Showなど)
  • データ型(data Bool = True | Falseなど)
  • 型変数の表現(head :: [a] > a
  • 型引数(Maybe a = Just a | Nothinga

などなど。

そもそもの知識がC、JavaRubyぐらいしかない状態で読んだので、「型引数をとる型で別の型をラップして、fmapなどで中の値にだけ関数を作用させる」ということがすごく高尚なことに思えて。それはなんとなく「難しいことをやってる」感を持つにはいいけどあまり理解はしていなかったように今では感じます。

さてそんな私ですが、2年ほどRustを学んで仕事でも使うようになり、Rustの言語仕様には慣れてきました。そこで久しぶりにこの本を読み返してみると「これはRustでいう○○だな!」というふうに理解しやすくなっていました。

  • 型クラスはトレイトをderiveするってことか
  • データ型はenumそのものだ
  • 型変数はRustでいう関数のシグネチャに似てるし、型制約は(Rustの)where句で表現しているやつ
  • Maybe a型はOption<T>と同じ意味か

Rustは元々Haskellの影響を受けているので上記は当然かもですが、手続き型言語パラダイムしか身についていなかった私には、RustをやってからHaskellを読むのが合っていたようです。Haskellは関数・引数・型の表現にあまり括弧を使わない言語仕様であるからか、慣れにくいところはあるかもしれません。Rustは記法として括弧をよく使うため、それらの関係性が見た目にもわかりやすかったのです。

いやまぁ、ぶっちゃけるとRustだけではなくて、ここ2年ぐらいでいろいろなプログラミング言語を学習してきたおかげが一番大きいのかもしれませんが。