Monoid


#1

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 درست کرد


معادل UML برای زبانهای فانکشنال : Category theory