『プログラミングHaskell』の練習問題を解く

スタートHaskell第1回の予習です。
『プログラミングHaskell』の練習問題を解いています。
2章の半ばまでの練習問題です。

1.7 練習問題

1. double (double 2) の結果を算出する他の計算方法を考えよ。
double (double 2)
    ={ 内側のdoubleを適用 }
double (2 + 2)
    ={ doubleを適用 }
(2+2)+(2+2)
    ={ 最初の+を適用 }
4+(2+2)
    ={ 次の+を適用 }
4+4
    ={ +を適用 }
8

もしくは

double (double 2)
    = { 外側のdoubleを適用 }
(double 2)+(double 2)
    = { 次のdoubleを適用 }
(double 2)+(2 + 2)
    = { 次の+を適用 }
(double 2)+4
    = { double を適用 }
(2+2)+4
    = { 最初の+を適用 }
4+4
    = { +を適用 }
8
2. x の値にかかわらず sum[x] = x であることを示せ。
sum[x]
    = { sumを適用 }
x + sum[]
    = { sumを適用 }
x + 0
    = { +を適用 }
x
3. 数値のリストに対し要素の積を計算する関数productを定義せよ。
puroduct[] = 1
puroduct(x:xs) = x * product xs
そして、その定義を使って product[2,3,4]=24 となることを示せ。
product[2,3,4]
    = { puroductを適用 }
2 * (product[3,4])
    = { puroductを適用 }
2 * (3 * product[4])
    = { puroductを適用 }
2 * (3 * (4 * product[]))
    = { puroductを適用 }
2 * (3 * (4 * 1))
    = { *を適用 }
24
4. リストを逆順に整列するように関数qsortの定義を変えるにはどうすればよいか?
qsort[] = []
qsort(x:xs) = qsort larger ++ [x] ++ qsort smaller
                where
                    smaller = [a|a<-xs,a<=x]
                    larger = [b|b<-xs,b>x]
5. qsortの定義で、<=を<に置き換えるとどのような影響があるか?

ヒント:例として[2,2,3,1,1]を考えてみよ。

qsort[] = []
qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger
                where
                    smaller = [a|a<-xs,a<x]
                    larger = [b|b<-xs,b>x]

qsort[2,2,3,1,1]
    ={ qsortを適用 }
qsort[1,1] ++ [2] ++ qsort[3]
    ={ qsortを適用 }
(qsort[] ++ [1] ++ qsort[]) ++ [2] ++ (qsort[] ++ [3] ++ qsort[])
    ={ qsortを適用 }
([] ++ [1] ++ []) ++ [2] ++ (qsort[] ++ [3] ++ qsort[])
    ={ qsortを適用 }
[1] ++ [2] ++ [3]
    ={ qsortを適用 }
[1,2,3]

2.6 練習問題

1. 次の式に括弧を付けよ。
(2^3)*4
(2*3)+(4*5)
2+(3*(4^5))
2. この章の例題をHugsを用いて実行せよ。

(後で実行する)

3. 以下のプログラムにはエラーが3つある。エラーを修正し、Hugsで正しく動くか確かめよ。

以下、修正したプログラム。

n = a `div` length xs
    where
        a = 10
        xs = [1,2,3,4,5]