おさらい
アプリカティブの便利関数
モノイド
typeとかnewtypeとか
- type(シノニム エイリアスを貼るだけ)
- newtype(型コンストラクタが1つだけ 中身を見ないので評価が遅延されて動きが変わる newtypeを使うと遅延評価で早くなる?)
- data(データ型定義の基本)
モノイド大集合
- 特定の振る舞いをすれば、それはモノイドである、という話
今回
Monoid型クラス
モノイドは、結合的な二項演算子( 2 引数関数)と、その演算に関する単位元からなる構造
- mempty
- mappend
- mconcat
などの関数がある
レファレンスはこちら Data.Monoid
- モノイドは具体型
- アプリカティブやファンクターはリストなどパラメータをとる
こんな感じの性質を持っているのがモノイド
0 + 100 -> 100 100 + 0 -> 100
Prelude Data.Monoid> foldr (++) "" ["a","b","c"] "abc" Prelude Data.Monoid> foldr (+) 0 [1,2,3,4,5] 15
モノイド則
モノイドには固有の二項演算があること、その二項演算に関する単位元があること、その二項演算は結合的であること、などの条件がある
Haskell的には以下のコードが満たされていることが重要
mempty `mappend` x = x x `mappend` mempty = x (x `mappend` y) `mappend` z = x `mappend` (y `mappend` z)
対象となる演算によって単位元は変わる
1 * 100 -> 100 100 * 1 -> 100
計算方法によっては、モノイドであったりモノイドでなかったりする
// モノイドの例 ("a" ++ "b") ++ "c" "a" ++ ("b" ++ "c") // モノイドではない例 100 / 100 / 100 100 / (100 / 100)
- 行列演算もモノイド。
モノイドとの遭遇
リストはモノイド
なお、mappendの左単元と右単元を交換して結果が異なっても構わん。
ProductとSum
AnyとAll
Ordering
Maybe
モノイドで畳み込む
Foldableのはなし
Foldableのリファレンス Data.Foldable
参考図書
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 580回
- この商品を含むブログ (69件) を見る