### Functor Laws

All function are expected to exhibit certain kinds of functor-like properties and behaviors. … The first functor law states that if we get back should be the same as the original functor.

The second law says that composing two functions and then mapping the resulting function over a functor should be the same as first mapping one function over the functor and then mapping the other one.

### Applicative Laws

Applicative也有相应的Laws

### Semigroup Laws

Semigroup Laws比较简单:

• closure，对于任意a,b属于semigroup Fappend(a,b)也必须属于F，这点由类型系统来保证，所以scalaz中没有这个。

• associativity,对于任意a,b,c属于semigroup Fappend(append(a,b),c)应该与append(a, append(b,c))相等。

### Option as Monoid

One way is to treat Maybe a as a monoid only if its type parameter a is a monoid as well and then implement mappend in such a way that it uses the mappend operation of the values that are wrapped with Just.

### Foldable

Because there are so many data structures that work nicely with folds, the Foldable type class was introduced. Much like Functor is for things that can be mapped over, Foldable is for things that can be folded up!

scalaz中的Foldable，提供这种功能。