2011年12月4日日曜日

Semigroup, Zero, Monoid

今日はSemigroupでゲソ!

この記事は

Functional Ikamusume Advent Calendar jp 2011



一人Scalaz Advent Calendar

を兼ねているんじゃなイカ!?


Semigroup

Semigroupは結合可能という性質を表すでゲソ。

Semigroupは関数 def append(s1: S, s2: => S): S を持ち、2つの値から一つの結果を得る関数を持つでゲソ。

Semigroupのインスタンスはsemigroup関数を使うことで定義できるんじゃなイカ?

Semigroups#semigroup


Semigroupを利用する関数

|+|

加算だけでなく、型によって様々な動きをするでゲソ。


加算や連結、論理和のような動きをするでゲソ。
===と同様に型安全でもあるでゲソ!

・・・・・Semigroup単体だとこれだけでゲソ。

あまりにも寂しいのでZero, Monoidまでやろうじゃなイカ!

Zero

Zeroは単位元を表すでゲソ。

mzero

mzeroは型パラメータを取り、その型の単位元を返すでゲソ。

matchOrZero

matchOrZeroは型パラメータとPartialFunctionを取り、マッチしない場合はその型の単位元を返すでゲソ!


Zeros#zero

Zeroのインスタンスはzeroにより定義できるんじゃなイカ?


そして、SemigroupとZeroを兼ね備えたものがMonoidなのでゲソ!

Monoid

MonoidはSemigroupとZeroを継承したものでゲソ。

Monoidは

forall a. append(zero, a) == a

forall a. append(a, zero) == a

を満たすのでゲソ。


イカ娘も立派なモノイドじゃなイカ?

Monoid単体を利用する関数はほとんどないのでゲソ。
Monoidは他の型クラスと一緒に使うことが多いのでその時に紹介しようじゃなイカ!

0 件のコメント:

コメントを投稿