1日目
ひげぽんはp26の演習をやっているのでそこに追いつくのが目標です。
序文
読みづらい!パス
第1章 p1 -
p4 「環境」
注釈の括弧が入れ子になってるところがさすがだね。
p17
sqrtをhakellで書き直したりした
p20 末尾再帰
再帰的プロセスの方が自然に見えるけどどっちで書くべしというのがわからず。スペースが問題になりそうと思ったら反復的にとかするのは面倒そう。いったんコンパイルするようなものだと末尾再帰的に直してくれたりしそうではある。
p20 フィボナッチ数
ところで、入門Haskellに載ってた
fib = 0:1:(zipWith (+) fib (tail fib))
はとても自分で書けるようになる気がしないんだけど、書けるようになるものなんだろうか。
p23 再帰的プロセス
上に書いた疑問の通りに話が進んだのでよかった。
問題1.11
反復的 scheme
(define (f n) (define (f-iter a b c count) (if (= count 0) c (f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1)))) (f-iter 2 1 0 n))
f n = fIter 2 1 0 n where fIter a b c count | count == 0 = c | otherwise = fIter (a + 2 * b + 3 * c) a b (count - 1)
現在の環境
http://d.hatena.ne.jp/higepon/20060415/1145108067 にならって、screenの2つのバッファでemacsを立ち上げて、それぞれの下領域1/4をgoshとhugsにする。hugsの方は C-x C-e すると何かを評価しているらしいもののよくわからないので、編集の度に :load とか :reload とかやってます。あとコンソールの上にキーボードの図を置いて、直接キーボードを見ないようにしてます。
問題1.12
こんな感じ?
pascal x y | x == 0 || x == y = 1 | otherwise = pascal (x - 1) (y - 1) + pascal x (y - 1)
schemeはめんどくさいからやめた。
問題1.16
こうかな
fastExp b n = fastExpIter 1 b n where fastExpIter a b n | n == 0 = a | even n = fastExpIter a (b^2) (n `div` 2) | otherwise = fastExpIter (a * b) b (n - 1)
ちょっと悩んだ。奇数分をaに退避させとけってことなんだけど先生が不変量云々言うから余計迷った感。あと数値の型の理解があやふや。
問題1.17, 1.18
double n = n * 2 halve n = n `div` 2 mul a b | b == 0 = 0 | even b = mul (double a) (halve b) | otherwise = a + (mul a (b - 1)) mul2 a b = mul2Iter 0 a b where mul2Iter m a b | b == 0 = m | even b = mul2Iter m (double a) (halve b) | otherwise = mul2Iter (m + a) a (b - 1)
今後の展望
Haskellの書き方が怪しいので、先に進む前にこないだ買った洋書のをまず読もう