読者です 読者をやめる 読者になる 読者になる

年に一つは新しいプログラミング言語を

Haskell
と「達人プログラマ」って本に書いてある
大学入るまでは,2年に1個ぐらいだったけど,
これからは実践しようかな.

というのも,最近新しいパラダイムに興味があって,
自己紹介欄都下に書いてある通り,
使えるパラダイムのレパートリーが少ないんですよね.

ってわけでTwitterのTL上でよく見る関数型のHaskellに挑戦してみようと思います.
$ sudo apt-get install haskell-platform hugs
と.
コンパイラインタプリタです.

では,前に書いたやつにしたがって,

1.言語の特徴
関数型らしい
遅延(必要になったときに)評価するらしい

これで十分かな.

2.何か出力する
インタプリタに値を返すと出力する
$ hugs
Hugs> "test"
test

C言語みたいに出力するのは難しいらしいのでパス
たとえば
Hugs> putStr "test"
見たいに書くのは遅延評価のせいでいつでも正しくできるとは限らないらしい.

ってわけで,*.hsでモジュールを書いて,ghciかhugsでロードして実行する感じかな.

[test.hs]
f x y = x + y
g = 2
$ ghci test.hs
*Main> f 2 3
5
*Main> g
2


3.コメントとか
-- 一行コメント
{- ブロックコメント -}

4.制御

分岐の方法だけで結構あるらしい
- 引数のパターンマッチング
オーバーロードみたいな感じかと思ったら少し違った
[fact.hs]
fact 0 = 1
fact n = n * fact (n - 1)
数学の定義みたいに書けてる
$ ghci fact.hs
*Main> fact 5
120

特定性の高い順に書く必要があるので,行を入れ替えるとfact 0が無限ループする.
すなわち「fact 0」を呼び出すと,
先に書いてあるfact nにマッチして,実行され続けます.

- guard
上のパターンマッチングを条件で行う感じ.
fibo n | n <= 1 = n | otherwise = fibo (n - 1) + fibo (n - 2) - if-then-else いつも通りのif文 check n = if n > 0
then "OK"
else "Error"
でも,関数型って制御の流れみたいのものは無さそうだから,
「条件によってこの行へ」って感じより,「条件によってどちらを返す」って感じなんだろうな.

- case-of
score c = case c of
'a' -> 90
'b' -> 70
'c' -> 50
'd' -> 30
_ -> 0

繰り返しは再起で書けということらしい.
とりあえず,僕はn回繰り返すなら,C++とかなら反射的に
for (int i = 0; i < n; i++) と書くようにしているけど,これがHaskellなら, f 1 = 1 f n = n + f (n - 1) ・・・いや,少し違うか. これまでの感覚は通用しないらしい. とりあえず入り口には立てた感じがするし,十分かな. 参考サイト:http://www.shido.info/