UbuntuでHaskell

なにか関数型言語を実用的なレベルまで使えるようになりたいと、常々思っていたのもあり、LispHaskellかで迷ったのですが、対話形式での扱いやすさはHaskellのほうが強い気が(なんとなく)したので、Haskellをメインに学習していく事にしました。

とりあえずghc6をapt-getします。

tune@tune-pgmPC:~$ sudo apt-get install ghc6
[sudo] password for tune: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  linux-headers-2.6.38-8 linux-headers-2.6.38-8-generic
これらを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
  libbsd-dev libffi-dev libgmp3-dev
提案パッケージ:
  ghc6-prof ghc6-doc haskell-doc libgmp3-doc libmpfr-dev
以下のパッケージが新たにインストールされます:
  ghc6 libbsd-dev libffi-dev libgmp3-dev
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 0 個。
43.0 MB のアーカイブを取得する必要があります。
この操作後に追加で 202 MB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://jp.archive.ubuntu.com/ubuntu/ natty/main libgmp3-dev i386 2:4.3.2+dfsg-1ubuntu3 [435 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu/ natty/main libffi-dev i386 3.0.9-3ubuntu1 [83.2 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu/ natty/main libbsd-dev i386 0.2.0-1 [91.7 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu/ natty/universe ghc6 i386 6.12.3-1ubuntu7 [42.4 MB]
2% [4 ghc6 461 kB/42.4 MB 1%]                                                  
43.0 MB を 16分 29秒 で取得しました (43.4 kB/s)                                
未選択パッケージ libgmp3-dev を選択しています。
(データベースを読み込んでいます ... 現在 199651 個のファイルとディレクトリがインストールされています。)
(.../libgmp3-dev_2%3a4.3.2+dfsg-1ubuntu3_i386.deb から) libgmp3-dev を展開しています...
未選択パッケージ libffi-dev を選択しています。
(.../libffi-dev_3.0.9-3ubuntu1_i386.deb から) libffi-dev を展開しています...
未選択パッケージ libbsd-dev を選択しています。
(.../libbsd-dev_0.2.0-1_i386.deb から) libbsd-dev を展開しています...
未選択パッケージ ghc6 を選択しています。
(.../ghc6_6.12.3-1ubuntu7_i386.deb から) ghc6 を展開しています...
install-info のトリガを処理しています ...
man-db のトリガを処理しています ...
doc-base のトリガを処理しています ...
Processing 1 added doc-base file(s)...
Registering documents with scrollkeeper...
libgmp3-dev (2:4.3.2+dfsg-1ubuntu3) を設定しています ...
libffi-dev (3.0.9-3ubuntu1) を設定しています ...
libbsd-dev (0.2.0-1) を設定しています ...
ghc6 (6.12.3-1ubuntu7) を設定しています ...
update-alternatives: /usr/bin/runhaskell (runhaskell) を提供するために 自動モード で /usr/bin/runghc6 を使います。
update-alternatives: /usr/bin/haskell-compiler (haskell-compiler) を提供するために 自動モード で /usr/bin/ghc6 を使います。
update-alternatives: /usr/bin/ghc (ghc) を提供するために 自動モード で /usr/lib/ghc-6.12.3/bin/ghc を使います。
update-alternatives: 警告: 関連する (リンクグループ ghc の) ファイル /usr/lib/ghc-6.12.3/bin/hasktags が存在しないので、/usr/bin/hasktags の作成をスキップします。

ポケットwi-fiで低回線だからか、30分ちかくインストールに時間がかかってしまいました。
最後のメッセージの内容が気になります。hasktagsってなんでしょう?

とにかく、今のところは使えれば良いので、色々叩いて遊んでみます。

tune@tune-pgmPC:~$ ghci6
GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>

起動は特に問題無し。再帰処理で階乗の関数とか。

Prelude> let kaijo = \x -> if x==1 then 1 else kaijo (x-1)*x
Prelude> kaijo 1
1
Prelude> kaijo 2
2
Prelude> kaijo 3
6
Prelude> kaijo 4
24
Prelude> 

map関数でリストにして出力してみたりとか。

Prelude> map kaijo [1,2..]
[1,2,6,24,120,720,5040,40320,362880,

〜中略〜

571338395644585459^C0478Interrupted.
Prelude> 

これだけでもパワフルな言語というのはわりと実感できるのですが、まったく使いこなせていないので、ゆっくり自分のものにしていく予定です。
java開発の片手間で、電卓がわりに使ったりすると便利かもしれないです。