tanaka 19:30 PM
すいません、長い間個人用セクションを開けっ放しにしておりました、tanakaです。今回からこのコーナーではプログラミング言語Haskellで遊ぶことにします。
ここまで読んで、えっ、(このカテゴリの)P言語ってPHP/Perl/Ruby/Pythonのことを言うんじゃないの?と思われた方がいるかもしれません。
違います。P言語とはPractical Languageのことを言います。 えーっと、結局、なにか今まで触ったことのない言語をいじりたくなっただけです。ですが、芸は身をHaskell
という格言もあるようですし→ProgrammerProverb - MoriMoinなにごともチャレンジということで。
さて、まだ長続きしないかもしれないのに、入門書を買うのは待って、情報収集しましょう。
- 本物のプログラマはHaskellを使うITProの連載のようです。まだ続いている模様。いくつか資料を探してみた結果、GHCをインストールしました。
- Haskell のお勉強
- HelloWorld - Haskellメモ - Wiki
資料探しはとりあえずこのくらいで、Haskellで遊ぶことにします。WEB+DB PRESS vol.34に小飼弾さんによるHaskell特集があったのでそれをやってみました。
実行系のインストール
% apt-get install ghc
Debianにインストールすると180MBも容量を食うので、注意してください。
まだ情報収集もあまり出来ていませんが、とにかく、コードを書いて実行することにします。
GHCiで遊ぶ
まずは、逐次実行する環境のghciを動かします。
% ghci
計算機的使い方ができます。
Prelude> 3 + 15 18 Prelude> 10 - 43 -33 Prelude> 11 * 44 484 Prelude> 34 / 12 2.8333333333333335 Prelude> 10 ** 4
ifの実装
関数でifが実装できるそうです。以下のコードをエディタで記述して保存します。(よくわからないが、ghciの中では定義できない)
myif.hs
myif True t f = t myif False t f = f
これは手続き型言語におけるif文の使い方ではありません。(ぱっと見、if文を使っている側のコードに見えますが)myif関数ともいうべきものらしいです。これを保存したら、ghciで読み込んであげます
Prelude> :load myif.hs [1 of 1] Compiling Main ( myif.hs, interpreted ) Ok, modules loaded: Main. *Main>
次に定義したmyifを使ってみます。
*Main> myif (3 > 2) "yes" "no" "yes" *Main> myif (1 == 1) "yes" "no" "yes" *Main> myif (3 < 2) "yes" "no" "no"
使い方を見てみると、先ほどのmyifの定義の意味がわかってきた気がします。myifを使ったときの「(3 > 2)」 「"yes"」 「"no"」はすべて関数側に渡されて、そして結果がかえってくると。関数定義の「=」の右側と左側で意味が違うようです。
遅延評価がわかる例
Haskellの特長の一つに、遅延評価というものがあるそうです。haskell - バリケンのHaskell日記 - 遅延評価のまとめを見ると、文字列の替わりに出力(putStrLn x)を渡していました。"then"と"else"が出力されるように書かれていますが、実際に出力されるのはどちらか一方です。myif関数に3つの値が渡されて、値が戻ってきたあとで、出力が評価されているということみたいです。
まとめ
- Haskellには1行ずつ実行できるシェルがある(ghci,hugsはちょっと使ってみました。)
- それらはそのままでもちょっとした計算機になる。
- ifを実装
- 必要な時まで式(expression)は評価されない=遅延評価
- やっぱり本を買おうかな












