Assyのリベラル文学研究所もご覧ください。

Haskell

Haskell

純粋な関数型言語。「出来ることが制限された言語」として有名。やると人生が変わるらしい。

Haskellサンプルコード

Haskell入門 5ステップにサンプルコードがあります。
詳しくは、上記のコードを読んでいただくとして、説明すると、

  • facとackとfibは再帰関数で、パターンマッチを使うことで引数が0の時は~とする、それ以外の時は再帰的に呼び出す、といった「数学的に美しいコード」を記述できる。
  • またwhereを使うことで、変数を使用箇所の下で定義できる(上で使うにはletを使う)。
  • また、それだけではなくこのコードは並列処理で実行される(`par`が並列処理を表す)。
  • また、doを使うことで連続してprintしたりできる。
  • letではdoがなければ最後にinが必要。
  • ``で引数を囲むのは中置演算子として利用するため。
  • 原則、変数は再代入できない(代入ではなく束縛という言葉を使う)。

パターンマッチングとガード

Haskellは強力なパターンマッチングと呼ばれる機能があり、「群を抜いて強力」であると言われる。
引数の構造によって関数を場合分けして定義することができる。
また、ガードは引数の構造ではなく、満たす性質で場合分けすることができる機能。
パターンマッチがswitch case文に相当するなら、ガードはif ~ else if文に相当すると言える。

関数か、変数か

僕は、Haskellのような関数型言語には、「関数か、変数か」という考え方があると思う。
普通、手続き型のプログラミング言語で言う関数は、特定の名前がついていて、コードブロックのどこかにあって、一度決まったら再度変更することはできず、どこからでも呼び出せる。
逆に、変数にも特定の名前がついているが、使用するよりも前に宣言されている必要があり、一度決まっても再度変更することができて、同じスコープの中からのみ呼び出せる。
僕は、関数型のプログラミング言語とは、こうした「関数と変数の違い」を無くし、「全てを関数=変数として使う」ということができる、ということではないかと思う。
特に、HaskellやElmのような関数型言語では、関数と同じように、変数はどこからでも、順序を関係なく呼び出すことができて、再度変更することはできない。
こうした「関数か、変数か」という部分の統一が分かると、関数型言語は良く分かってくると思う。

Haskellは悟りを得られる

Haskellのメリットとして、「悟りが得られる」というのが僕はあると思います。
Haskellをやると、人生が変わると言っている方も居ます。これはRustと同様に「美しいスタイルでプログラミングができる能力がつく」というのもありますが、僕が思うに、「悟りが得られる」のです。
Haskellは、プログラミング言語界の仏典のようなものです。特に昔の僕のような引き篭もりやニートが自分で思いつく多くのことは、Haskellが実現しています。数学的でもありながら、「プログラミングにおける覚者」となることができます。