12月9日&10日の学び

最近Haskellばかり書いているな。。

メモ

  • 述語とは真理値を返す関数

map関数

関数とリストを受け取り、その関数をリストの全要素に適用して新しいリストを生成する。

Prelude> map (+3) [1, 5, 3, 1, 6]
[4,8,6,4,9]
Prelude> map (map (^2)) [[1, 2], [3, 4, 5, 6], [7, 8]]
[[1,4],[9,16,25,36],[49,64]]

ラムダ式

ラムダ式は1回だけ必要な関数を作るときに使う無名関数。通常ラムダ式高階関数に渡す関数を作るためだけに使われる。

Prelude> map (+ 3) [1, 2, 3]
[4,5,6]
Prelude> map (\x -> x + 3)[1, 2, 3, 4]
[4,5,6,7]

畳み込み

  • リストの再帰処理には、「再帰せず初期値を設定する場合」と「再帰する場合」を分けて書く必要がある。
  • 畳み込みでは両者を区別する必要がない。
  • 畳み込みは正直良くわからないので練習がまだ必要。。。

畳み込みのフォーマット

foldl 2引数関数 初期値 リストの形式を取る

左畳み込みの例

  • 左畳み込みはリストの左端の要素から始める
  • 左畳み込みを用いたmapの実装例は以下
  • 注意:'++'は2つのリスト同士を結合してリストを生成する演算子
map' :: (a -> b) => [a] -> [b]
map' f xs = foldl (\ acc x -> acc ++ [f, x]) [] xs

右畳み込みの例

  • 右畳み込みはリストの右端の要素から始める
  • 右畳み込みを用いたmapの実装例は以下
  • 注意:':'は文字とリストを結合してリストを生成する演算子
map' :: (a -> b) => [a] -> [b]
map' f xs = foldr (\ x acc -> f x : acc) [] xs

関数適用演算子

  • 関数適用演算子の$は最も低い優先度を持っており右結合
  • この特徴を利用すると式の中の()の数を減らすことで可読性を向上させることができる
Prelude> sqrt $ 3 + 4 + 9 + 1
4.123105625617661
Prelude> sqrt (3 + 4 + 9 + 1)
4.123105625617661
Prelude> sum (filter (> 10) (map (*2) [2..10]))
80
Prelude> sum $ filter (> 10) $ map (*2) [2..10]
80