できたらいいなAndroidアプリ

Androidに限らずいろいろ書いていく。

プログラミング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]