むずかしめのパソコン勉強の記録

計算機科学とか関数型言語とか

すごいHaskellたのしく学ぼう 第4章 再帰の練習

すごいH本の4章で再帰の練習のページがあります。
答えをなるべく見ずに自分で実装してみる。

maximum関数の実装

maximum' :: (Ord a) => [a] -> a
maximum' [] = error "empty list"
maximum' [x] = x					
maximum' (x:xs) = max x (maximum' xs)

空リストの挙動の記載を忘れていたので、後から追加。(無いとパターンマッチングできませんというエラーがでます。)
max関数は(Ord a) => a -> a -> aなので、リストの形にするために再帰を使って最後から値を繰り上げていきます。
[3, 5, 2]の場合、以下の通りに順次計算できます。

maximum’ (3:[5,2]) 
	==>	max 3 (maximum’ [5,2])
	==>	max 3 (maximum' (5:[2]))
	==>	max 3 (max 5 (maximum [2]))
	==>	max 3 (max 5 2)
	==>	max 3 5
	==>	5

replicate関数の実装

replicate' :: Int -> a -> [a]
replicate' n x
    | n <= 0 = []
    | otherwise = x : replicate' (n-1) x

単純な形。
replicate’関数をnが0になるまで再帰で呼び続けます。
ちなみにこれの制限をなくしたのがrepeat関数の実装ですね。

repeat' :: a -> [a]
repeat' a = a : repeat' a

遅延評価のおかげで表示に必要な計算のみを順次行うので、固まらずに延々と値を吐き出し続けます。

*Main> repeat' 'a'

“aaaaaaaaaaaaaaaaaaa.....aa^CaaaaaaaaaaaaaInterrupted.