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))

haskell

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)

括弧がない分 haskell のが書きやすい。あと haskell-mode のインデント具合がまだ理解できない。

現在の環境

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はめんどくさいからやめた。

p25

Knuth参照またきた。プログラマたるもの読んどけなのか。

問題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)
問題1.19

線形代数をちゃんとやってるとこういうアルゴリズムがパッと思いつくんだろうなあ。数学が高校レベルでよくないなあ。解くのは単なる計算なのでいい。

今後の展望

Haskellの書き方が怪しいので、先に進む前にこないだ買った洋書のをまず読もう