top page > computer > haskell > web_lecture > for_programmer > monoid_more.html
更新日:
文責: 重城良国

もっとモノイド

(工事中 60%)

はじめに

モジュールData.Monoidには定義されていないが最大、最小を求める演算もある条件下ではモノイドとなる。

Max型

monoid_more.hs

Max型を定義する。

newtype Max a = Max { getMax = a }

単位元をその型における最小値とすることで関数maxによるモノイドができる。

型クラスMonoidのインスタンスにする。

instance (Ord a, Bounded a) => Monoid (Max a) where
mempty = Max minBound
mappend (Max x) (Max y) = Max $ x `max` y

リストをひとつの値にたたみこむ

リストをひとつの値にたたみこむ関数の多くはmconcatにまとめられる。

concat :: [[a]] -> [a]
concat = mconcat

and, or :: [Bool] -> Bool
and = getAll . mconcat . map All
or = getAny . mconcat . map Any

sum, product :: Num a => [a] -> a
sum = getSum . mconcat . map Sum
product = getProduct . mconcat . map Product

maxim :: (Ord a, Bounded a) => [a] -> a
maxim = getMax . mconcat . map Max

getSomeやmap Someはnewtypeによるラッパ型との相互変換である。つまりどの関数も本質的にmconcatによって抽象されていることがわかる。Monoidにする方法が1通りしかないリストについてはラッパは不要であり、concatはそのままmconcatで定義できる。

課題

  1. 関数minを演算とするモノイドを定義せよ

「モノイドとは」へもどる 「ファンクターとは」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics