背景 すごいHaskellたのしく学ぼう!を以前読んだのですが、モノイドやモナドあたりから理解が曖昧でした。 最近モノイドについて復習しましたので、備忘録としてまとめておこうと思います。 Monoidの実装 HaskellのMonoidクラスは以下のような定義です。 昔はMonoid単体で実装されていました。しかし、GHC8.4からはSemigroupを用いた定義に変更されました。 実装が必要なのはSemigroupの (<>) と Monoidのmemptyで、そのほかの関数はデフォルト実装があります。つまりSemigroup + 単位元の実装でMonoidを作れます。 class Semigroup a where (<>) :: a -> a -> a class Semigroup a => Monoid a where mempty :: a mappend :: a -> a