Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
// Variation of https://gist.github.com/deanwampler/6c1496da43bf338019beee2c5ea70ce4#file-scala2-3-monoidtypeclassdef-scala
import scala.annotation.infix
trait Semigroup[T]:
extension (t: T):
@infix def combine(other: T): T // @infix allows "foo combine bar".
def <+>(other: T): T = t.combine(other)
trait Monoid[T] extends Semigroup[T]:
def unit: T
// Redefine the monoid instances. Note that @infix is required for the two combine definitions, even though the trait
// had @infix.
given StringMonoid as Monoid[String]:
def unit: String = ""
extension (s: String) @infix def combine(other: String): String = s + other
given IntMonoid as Monoid[Int]:
def unit: Int = 0
extension (i: Int) @infix def combine(other: Int): Int = i + other
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.