Semiring
The Semiring type class for a given type A
combines both a commutative additive Monoid and a multiplicative Monoid. It requires the multiplicative Monoid to distribute over the additive one. The operations of the multiplicative Monoid have been renamed to one and combineMultiplicate for easier use.
The one function serves exactly like the empty function for an additive Monoid, just adapted for the multiplicative version. This forms the following law:
Please note that the empty function has been renamed to zero to get a consistent naming style inside the semiring.
Currently, Semiring instances are defined for all available number types.
Examples
Here a some examples:
import arrow.typeclasses.Semiring
fun main(args: Array<String>) {
val result =
//sampleStart
Semiring.int().run { 1.combine(2) }
//sampleEnd
println(result)
}
Content copied to clipboard
import arrow.typeclasses.Semiring
fun main(args: Array<String>) {
val result =
//sampleStart
Semiring.int().run { 2.combineMultiplicate(3) }
//sampleEnd
println(result)
}
Content copied to clipboard
The type class Semiring
also has support for the +
*
syntax:
import arrow.typeclasses.Semiring
fun main(args: Array<String>) {
val result =
//sampleStart
Semiring.int().run {
1 + 2
}
//sampleEnd
println(result)
}
Content copied to clipboard
import arrow.typeclasses.Semiring
fun main(args: Array<String>) {
val result =
//sampleStart
Semiring.int().run {
2 * 3
}
//sampleEnd
println(result)
}
Content copied to clipboard