UNPKG

fp-ts

Version:

Functional programming in TypeScript

39 lines (38 loc) 1.27 kB
/** * The `Semiring` class is for types that support an addition and multiplication operation. * * Instances must satisfy the following laws: * * - Commutative monoid under addition: * - Associativity: `(a + b) + c <-> a + (b + c)` * - Identity: `zero + a = a + zero <-> a` * - Commutative: `a + b <-> b + a` * - Monoid under multiplication: * - Associativity: `(a * b) * c <-> a * (b * c)` * - Identity: `one * a <-> a * one <-> a` * - Multiplication distributes over addition: * - Left distributivity: `a * (b + c) <-> (a * b) + (a * c)` * - Right distributivity: `(a + b) * c <-> (a * c) + (b * c)` * - Annihilation: `zero * a <-> a * zero <-> zero` * * **Note:** The `number` type is not fully law abiding members of this class hierarchy due to the potential * for arithmetic overflows, and the presence of `NaN` and `Infinity` values. The behaviour is * unspecified in these cases. * * @since 2.0.0 */ /** * @category type classes * @since 2.0.0 */ export interface Semiring<A> { readonly add: (x: A, y: A) => A readonly zero: A readonly mul: (x: A, y: A) => A readonly one: A } /** * @category instances * @since 2.0.0 */ export declare function getFunctionSemiring<A, B>(S: Semiring<B>): Semiring<(a: A) => B>