\( \displaystyle \lim_{x \to \infty} e^{x} \). 初めてのブログ〜Haskell勉強会①〜

スタート

ブログなんて書いたことほとんどないけどHaskell勉強会が思ったより楽しかったのでこれを機にブログを解説してみることにしました。なんかプログラム的なことや面白いアルゴリズムを書いていけたらなぁ...
というわけでHaskellの面白そうなところをピックアップしていくことにしよう。

 

勉強会

プログラミングには,手続き型の言語やオブジェクト指向の言語などの様々な言語がありますが,新しく関数型というのを学びたく,Haskellの勉強会に参加してきました。この勉強会は,大学のある講義でHaskellを使用するので,講義参加者を主な対象に大学院の先輩が提案した自由参加の勉強会です。
今回は勉強する立場として参加させていただきました。
 PS.補足ですが,教えているのは同期でHaskellが好きで仕方ない優秀な人です。

Haskellとは数学的!!

僕が気になった理由にもなるんですけど,なんとかなり数学的な言語らしいんですね。今回の勉強会で気になった要素を以下にまとめるつもりなんですけど,プログラミング上の概念が数学的だったり無限が扱えたり,数学が好きなら面白そうな要素が数多く散りばめられていると思います(嫌いでも逆に数学を好きになれそうな要素もあるかも...?)。そんな言語を知るとっかかりになればいいな。

純粋関数型言語

Haskellとは純粋関数型言語というなんかかっこいい早口言葉みたいな言語らしい。関数型と呼ばれる言語は知っていましたが,どうやら"純粋"なようです。(まるで僕みたいですね。)

関数というのは,プログラミング上では,ある値を引き取って何かの処理をして値を返すものをいいます。例えば,「身長と体重」を受け取って「bmi値」を計算するプログラム上の計算値だったり,ある数列に対して「第10項」を受け取って「解」を返してくれるものだったり様々です。「言葉だとなんかなぁ」って人は中学や高校で習った一次関数や二次関数をイメージするといいのかな?
「難しかったなぁ」ってイメージではなく「\(\displaystyle f(x) = x+1\)」のようにxに値を代入したらx+1の解が得られる関数のような感じですね。(Haskellは難しくないです...きっと)
僕の印象ですが,Haskellでは,この「何かを入れたら何かが帰ってくるという関数」を定義して利用して行く言語のイメージです。常に解がある...数学みたいですね。

数学からプログラミング

さて,少しだけ言語の話をしましょう。先ほどの「\(\displaystyle f(x) = x+1\)」のプログラムを書いて見ました。コンパイラGHCを使っています。

add :: Int -> Int 
add a = a+1

これは僕が「add」という関数を作った例です。
この「add」が先ほどの「\(\displaystyle f(x)\)」に当たります。
上のプログラム「add :: Int -> Int」は,Int型を引数に取り,Int型を返すということを表します。簡単にいうと,xに整数を入力して整数の解を出力するような関数addを作るよーということをHaskellさんに伝えるわけです。実際にどの型を入力,出力するか明確にした後は,「add a = a+1」でadd関数に入力した値に1を加えて出力するんだよと定義します。関数を定義するときは,[入力値「=」出力値]のように定義します。こんな感じで誰でも簡単に関数を作ることができます。ね?簡単でしょう?

実はループ文が存在しない

僕がこの言語を知って最初に驚いたのはこれですね。多言語を知っている方ならおなじみのfor文やwhile文がHaskellには無いんですねー。数学的に考えるとfor文は\( \sum \)を表すので,繰り返しの処理(例えば階乗だったり1~nまでの足し算だったり...etc)をどうやって記述するのだろうと思ってました。
そこで,下のように階乗を求めてみました。

stairs' 0 = 1
stairs' 1 = 1
stairs' n = n * stairs' (n-1)


そう,Haskellでは,このような処理を再帰で記述していました。再帰とは基底部と再帰部を組み合わせて行う繰り返しの処理のことらしいです(今回詳しく知りました...)。基底部は,どこまで処理を行うかを決定する部分であり,繰り返す処理を再帰部で示します。上記の例で行くとn!はnから1までの総乗になるので,1が基底部になります。
そして,\(n \times (n-1) \times \dots \)の部分を再帰部として処理して行くわけですね。
以上が再帰処理になりますが,個人的に記述がわかりやすいと感じますね。他にも繰り返し処理に関してリスト内包表記というのもあるんですが,それは次の機会に...

型推論

Haskellという言語は大変頭が良いので,どうやら型を自動で推論してくれるらしい。GHCインタプリタを使って,早速色々型を指定してみました。

Prelude> a = 3
Prelude> :t a
a :: Num p => p

Prelude> b = "x"
Prelude> :t b
b :: [Char]

Prelude> c = "ussy"
Prelude> :t c
c :: [Char]

こんな感じで色々な値を代入した変数の型を:tで調べると型を宣言しなくても理解してくれていました。いやはや賢い。
これで関数に対して数を渡してるのか文字を渡してるのかを暗黙的に了解してくれるわけですね。もちろんadd関数のように明示的に宣言することもできますよ。なんて使いやすい言語でしょう!!(n回目)

まとめ

というわけで勉強会参加してきたのでその①をまとめてみました。初めてこんな感じでブログ書いたので稚拙だったり間違っていたりしてるかもしれないですが,久しぶりにHTMLやCSSに少し触ったので楽しかったですね。
さて,次のブログでHaskellのリスト内包表記,型クラス,カリー化,モナド辺りに触っていきたいと思います。前回の勉強会から復習し,理解しながらただいま勉強中ですが,理論的な感じがして楽しんでますね。
勉強に使用した本は参考文献に載せていますが,英語版は無料で読めるらしいです。
Rustの記事とかもそのうち書いていけたらなー

参考文献

すごいHaskell楽しく学ぼう - 著:Miran Lipovaca 訳:田中英行,村主崇行

Amazon CAPTCHA