by shigemk2

当面は技術的なことしか書かない

第2期 第19回 H本読書会 in 秋葉原 #readhbon

readhbon.doorkeeper.jp

おさらい

アプリカティブの便利関数

gist.github.com

モノイド

typeとかnewtypeとか

  • type(シノニム エイリアスを貼るだけ)
  • newtype(型コンストラクタが1つだけ 中身を見ないので評価が遅延されて動きが変わる newtypeを使うと遅延評価で早くなる?)
  • data(データ型定義の基本)

gist.github.com

モノイド大集合

  • 特定の振る舞いをすれば、それはモノイドである、という話

gist.github.com

今回

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)
  • 行列演算もモノイド。

モノイドとの遭遇

リストはモノイド

gist.github.com

なお、mappendの左単元と右単元を交換して結果が異なっても構わん。

ProductとSum

gist.github.com

AnyとAll

gist.github.com

Ordering

gist.github.com

gist.github.com

Maybe

gist.github.com

モノイドで畳み込む

Foldableのはなし

gist.github.com

gist.github.com

Foldableのリファレンス Data.Foldable

参考図書

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!