プログラミングHaskell 第1章 導入
この章は準備体操らしい。Haskellの歴史や関数の説明などが書かれている。
関数型プログラミング言語ってどんなもんなんだろう?と恐る恐る読んでみたが、まだ怖いめにはあってない。
練習問題の解答
1
double (double 2) = double (2) + double (2) = (2 + 2) + double (2) = (2 + 2) + (2 + 2) = 4 + 4 = 8
2
sum [x] = sum (x:[]) = x + sum [] = x + 0 = x
3
productの定義
product [] = 1 product (x:xs) = x * product xs
product [2, 3, 4]の計算
product [2, 3, 4] = 2 * product [3, 4] = 2 * 3 * product [4] = 2 * 3 * 4 * product [] = 2 * 3 * 4 * 1 = 24
4
問題の意図が「降順ソート」と「リバース」のどちらか分からなかった。
降順
qsortDesc [] = [] qsortDesc (x:xs) = qsortDesc larger ++ [x] ++ qsortDesc smaller where smaller = [a|a <- xs, a <= x] larger = [a|a <- xs, a > x]
リバース
reverse [] = [] reverse (x:xs) = xs ++ [x]
5
xsの中にxと等しい要素x'があった場合、x'はsmallerにもlargerにも含まれない。 そのため、qsortの結果にx'が含まれなくなる。
qsortの定義の「<=」を「<」に変更した関数をqsort'とすると
qsort' [2, 2, 3, 1, 1] = qsort' [1, 1] ++ [2] ++ qsort' [3] = (qsort' [] ++ [1] ++ qsort' []) ++ [2] ++ qsort' [3] = ([] ++ [1] ++ []) ++ [2] + [3] = [1, 2, 3]