第13章 プログラムの論証 #5

13.9 練習問題

  1. 付録Aにある標準ライブラリの中から重複のあるパターンを使って定義されている関数を探せ。

教科書を見ながら抜き出してみる。 ガードも重複パターンのうちかな?

A.1 クラス

min, max :: a -> a -> a
min x y | x <= y    = x
        | otherwise = y
max x y | x <= y    = y
        | otherwise = x

A.2 真理値

特になし

A.3 文字

toLower :: Char -> Char
toLower c
  | isUpper c = chr (ord c - ord 'A' + ord 'a')
  | otherwise = c

toUpper :: Char -> Char
toUpper c
  | isLower c = chr (ord c - ord 'a' + ord 'A')
  | otherwise = c

A.4 数値

特になし。累乗は多分重複のないパターン。

A.5 タプル

特になし

A.6 Maybe

特になし

A.7 リスト

last :: [a] -> a
last [x]    = x
last (_:xs) = last xs

takeWhile :: (a -> Bool) -> [a] -> [a]
takeWhile _ [] = []
takeWhile p (x:xs)
  | p x       = x:takeWhile p xs
  | otherwise = []

init :: [a] -> [a]
init [_]    = []
init (x:xs) = x:init xs

dropWhile :: (a -> Bool) -> [a] -> [a]
dropWhile _ [] = []
dropWhile p (x:xs)
  | p x       = dropWhile p xs
  | otherwise = x:xs

foldr1 :: (a -> a -> a) -> [a] -> a
foldr1 _ [x]    = x
fildr1 f (x:xs) = f x (foldr1 f xs)

zip :: [a] -> [b] -> [(a,b)]
zip [] _          = []
zip _ []          = []
zip (x:xs) (y:ys) = (x,y):zip xs ys

A.8 関数

特になし

A.9 入出力

特になし