この記事は
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 件のコメント:
コメントを投稿