August 13(Sat), 2011
■[haskell]『プログラミングHaskell』の練習問題を解く
スタートHaskell第1回の予習です。
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]
■[haskell]『プログラミングHaskell』の練習問題を解く
『プログラミングHaskell』の練習問題を解く、の続きです。
2.6 練習問題
4. この章で紹介したライブラリ関数を使って、空ではないリストの最後の要素を取り出す関数lastを定義せよ。さらに他の定義も考えよ。
last xs = head(reverse xs)
last xs = xs!!(length xs - 1)
5. 同様に、空ではないリストから最後の要素を取り除くライブラリ関数initが、二通りの方法で定義できることを示せ。
init xs = take(length xs - 1)xs
init xs = reverse(tail(reverse xs))
3.11 練習問題
1. 以下の値の型は何か?
['a','b','c'] [Char] [('a','b','c')] [(Char,Char,Char)] [(False,'o'),(True,'1')] [(Bool,Char)] ([False,True],['o','1']) ([Bool],[Char]) [tail,init,reverse] [[a] -> [a]]
