// @flow export interface Semigroup { concat(x: A, y: A): A } export function getProductSemigroup(asemigroup: Semigroup, bsemigroup: Semigroup): Semigroup<[A, B]> { return { concat([xa, xb], [ya, yb]) { return [ asemigroup.concat(xa, ya), bsemigroup.concat(xb, yb) ] } } }