カリー、map とその類似処理(5)

  • mapはリストによく使う
  • すべてのリスト要素に何か処理をするのがmap
  • それに似ているのは、filter。これもすべてのリスト要素に何か処理をするが、条件に合ったものだけを返して、それ以外は返さないところが違う
  • さらに類似は、foldl。これはリストの左からぱたぱたと要素に処理を振りかける。累積和みたいな。それを右からやればfoldr
Prelude> foldl (+) 0 [1..5]
15
  • 0+1=1, 2+1=3, 3+3=6, 4+6=10, 5+10 =15
Prelude> foldr (-) 0 [1..5]
3
  • 5-0=5 4-5=-1 3-(-1)=4 2-4=-2 1-(-2)=3
  • これを「見えるようにする」のがscanl scanr
Prelude> scanr (-) 0 [1..5]
[3,-2,4,-1,5,0]
  • 関数型言語だから、なんでも関数として表す
    • mapのように、リストに関数を要素ごとに適用するときに、関数ではないものも、あたかも関数であるかのようにして扱える。下の例$を使って、リストの方が「関数・処理のリスト」で、mapが振りかける「関数」の方が、「関数の形をした値」
Prelude> map ($ 3) [(4+), (*10),(10*),(^2)]
[7,30,30,9]
    • また、この$は処理順の制御を()を使わずに行うのにも使われる
Prelude> sum $ map sqrt [1,4,9]
6.0
Prelude> sum (map sqrt [1,4,9])
6.0
    • 関数の合成はf.g(x),f(g(x))みたいに
Prelude> (sum . (map abs)) [-3,2,5,-4]
14
Prelude> sum(map abs [-3,2,5,-4])
14