Haskellの標準ライブラリから関数の紹介をします.
覚書用のメモです.

Prelude

Haskellの標準関数のうち,最も基本的なものが定義されているモジュールです.

リストの操作

リストの操作に使える関数を紹介します.
文字列の処理等に使えます.

map(それぞれの要素に関数を適用させる)

map :: (a -> b) -> [a] -> [b]

リストの全ての要素に対して,指定した関数を適用する.

Prelude> map (+1) [0,1,2,3]
[1,2,3,4]

mapM(mapのモナド版)

mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]

適用する関数の返り値がモナドの場合に使います.

mapM_

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(先頭から部分リストを抜き出す)

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")

break(リストを2つに分割)

span :: (a -> Bool) -> [a] -> ([a],[a])
break p                 =  span (not . p)

spanとほとんど同じです.条件が逆転するので条件を満たす所までとそれ以降に分けます.
下のコードは文字列をスペースで分割します.

Main> break (==' ') "hoge hoe"
("hoge"," hoe")

foldr(リストを右から演算子で折りたたむ)

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(リストを左から演算子で折りたたむ)

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(リストを右から演算子で折りたたむ)

foldr1 f [x] = x
foldr1 f (x:xs) = f x (foldr1 f xs)

foldrに比べ引数が一つ減り,リストの中の値だけで折りたたまれます.

Hugs.Base> foldr1 (-) [1..3]
2

これは(1-(2-3))のようになります.

foldl1(リストを左から演算子で折りたたむ)

foldl1 f (x:xs) = foldl f x xs

foldr1の左から折りたたまれる版です.

Hugs.Base> foldl1 (-) [1..3]
-4

これは((1-2)-3)になります.

コメント


お名前: