A semigroup in type F must satisfy two laws:
The binary operation to combine f1 and f2.
The binary operation to combine f1 and f2.
Implementations should not evaluate tbe by-name parameter f2 if result
can be determined by f1.
An scalaz.Apply, that implements ap with append.
An scalaz.Apply, that implements ap with append. Note
that the type parameter α in Apply[({type λ[α]=F})#λ] is
discarded; it is a phantom type. As such, the functor cannot
support scalaz.Bind.
Every Semigroup gives rise to a scalaz.Compose, for which
the type parameters are phantoms.
Every Semigroup gives rise to a scalaz.Compose, for which
the type parameters are phantoms.
compose.semigroup = this