リストの操作

map :: (a -> b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs
  • (a -> b) なる関数(任意の型aの値を型bの値に移す関数)と[a](型aの値のリスト)とから、[b](型bの値のリスト)を返す
  • ([a]が空のリスト)ならを返す
  • (x:xs)(リストの先頭要素とそれ以外に分ける)に対して、先頭要素には関数fを、残りのリストには同じ処理を施すという再帰的定義をする
(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : xs ++ ys
  • [a] -> [a] (同じ値の型を持つ2つのリスト)を引数として、同じ値の型を持つ1つのリストを返す
  • 第1引数が[](空のリスト)のときと、そうでないときに処理を分ける
  • 第1引数が空でないときは、その先頭要素から順に対象とした再帰的定義をする
filter :: (a -> Bool) -> [a] -> [a]
filter _pred []    = []
filter pred (x:xs)
  | pred x         = x : filter pred xs
  | otherwise      = filter pred xs
  • (a -> Bool) (真偽を判断する関数)と[a](リスト)を引数に[a](リスト)を返す
  • 空リストなら空リストを返す
  • (x:xs)先頭の要素から順に対象とした再帰的定義をする
  • [y | y <- [1,2,3,4], y<3]という\{y | y \in X, y < x\}のような内包表現のXというリストと[tex:
  • "pred"は"predicate(述部)
(!!)                    :: [a] -> Int -> a
#ifdef USE_REPORT_PRELUDE
xs     !! n | n < 0 =  error "Prelude.!!: negative index"
[]     !! _         =  error "Prelude.!!: index too large"
(x:_)  !! 0         =  x
(_:xs) !! n         =  xs !! (n-1)