Haskellの標準ライブラリから関数の紹介をします.
覚書用のメモです.
Haskellの標準関数のうち,最も基本的なものが定義されているモジュールです.
リストの操作に使える関数を紹介します.
文字列の処理等に使えます.
map :: (a -> b) -> [a] -> [b]
リストの全ての要素に対して,指定した関数を適用する.
Prelude> map (+1) [0,1,2,3] [1,2,3,4]
mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
適用する関数の返り値がモナドの場合に使います.
mapM_ :: (Monad m) => (a -> m b) -> [a] -> m ()
適用する関数の返り値が,空のモナドの場合に使います.
IO () を返す関数で使う事が多いです.
例
main = do mapM_ (putStrLn) ["hoge", "moge", "sakana", "soyosoyo"]
ちなみに
main = do mapM (putStrLn) ["hoge", "moge", "sakana", "soyosoyo"]
でも動きます.
span :: (a -> Bool) -> [a] -> ([a],[a]) span p [] = ([],[]) span p xs@(x:xs') | p x = (x:ys,zs) | otherwise = ([],xs) where (ys,zs) = span p xs'
リストの先頭から条件を満たす部分とそれ以降に分ける.
下のコードは先頭の(=='a')を満たす部分とそれ以降に分けます.
Main> span (=='a') "aaahogeaaa"
("aaa","hogeaaa")
Main> span (=='a') "hogeaaa"
("","hogeaaa")
span :: (a -> Bool) -> [a] -> ([a],[a]) break p = span (not . p)
spanとほとんど同じです.条件が逆転するので条件を満たす所までとそれ以降に分けます.
下のコードは文字列をスペースで分割します.
Main> break (==' ') "hoge hoe"
("hoge"," hoe")
foldr f z [] = z foldr f z (x:xs) = f x (foldr f z xs)
例を見た方が早いです.
Hugs.Base> foldr (-) 0 [1..3] 2
これは (1-(2-(3-0)))のようになります.よって結果は2になります.
カッコの位置が重要で,リストの右から演算子が適用されます.
foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs
foldrの左から折りたたむ版です.
Hugs.Base> foldl (-) 0 [1..3] -6
かっこが(((0-1)-2)-3)のように付くので,結果が-6になります.
foldr1 f [x] = x foldr1 f (x:xs) = f x (foldr1 f xs)
foldrに比べ引数が一つ減り,リストの中の値だけで折りたたまれます.
Hugs.Base> foldr1 (-) [1..3] 2
これは(1-(2-3))のようになります.
foldl1 f (x:xs) = foldl f x xs
foldr1の左から折りたたまれる版です.
Hugs.Base> foldl1 (-) [1..3] -4
これは((1-2)-3)になります.