Monoid یک ساختار جبری که دو داده هم تایپ و باهم ترکیب میکنه و یک داده با همون تایپ بر میگردونه و یک function که با ترکیب با هر داده خوده داده رو برمیگردونه
object MonoidInt {
def combine(a: Int, b: Int): Int = a+b
def empty: Int = 0
}
object MonoidString {
def combine(a: String, b: String): String = a.concat(b)
def empty: String = ""
}
به طوره کلی تر
trait Monoid[A] {
def combine(a: A, b: A): A
def empty: A
}
علاوه بر ۲ function بالا monoid باید از دو قانون پیروی کنه
جابهجاییپذیری
a +b = b +a
شرکتپذیری
a+(b+c) = (a+b)+c
به نظر این بسیار ساده میاد اما این abstraction بسیار خوبیه
تمامه reducer ها در برنامه نویسی در واقع monoid هستند و چون هم شرکت پذیری دارند هم جابجائی به راحتی میشه
کار reduce تقسیم کرد در چند مرحله یا بصورت parallel انجام داد
import cats._
import cats.data._
import cats.implicits._
def reduce[T: Monoid](l: List[T]) = l.fold(Monoid[T].empty)(_ combine _)
parallel
def reduce[T: Monoid](l: List[T]) = l.par.fold(Monoid[T].empty)(_ combine _)
خیلی از مسائل در برنامه نویسی با monoid حل میشن
مثلا function هایی که یک ارگمنت میگیرن و یک تایپ برمیگردونن هم monoid تشکیل میدن و باهم میشه ترکیبشون کرد
و یک pipeline درست کرد