# Semigroupal

``public protocol Semigroupal``

The Semigroupal type class for a given type `F` can be seen as an abstraction over the cartesian product. It defines the function product.

The product function for a given type `F`, `A` and `B` combines a `Kind<F, A>` and a `Kind<F, B>` into a `Kind<F, (A, B)>`. This function guarantees compliance with the following laws:

Semigroupals are associative under the bijection `f = (a,(b,c)) -> ((a,b),c)` or `f = ((a,b),c) -> (a,(b,c))`. Therefore, the following laws also apply:

``````f((a.product(b)).product(c)) == a.product(b.product(c))
``````
``````f(a.product(b.product(c))) == (a.product(b)).product(c)
``````
• ``` product(_:_:) ```

Multiplicatively combine F and F into F<(A, B)>

#### Declaration

Swift

``````static func product<A, B>(
_ x: ``````Kind<Self, A>,
_ y: Kind<Self, B>) -> Kind<Self, (A, B)>``````

#### Parameters

 ``` x ``` First factor. ``` y ``` Second factor.

#### Return Value

Tupled result of combining the values provided by both arguments.