[Struktur Aljabar] Groupoid, Semigroup, Monoid

Muhammad Alfiansyah
4 min readSep 17, 2022

--

Photo by Dan Cristian Pădureț on Unsplash

Ada hal yang terjadi diluar keinginan manusia

Setelah sekian tahun mendalami dunia programming nggak pernah terpikir atau menyangka pelajaran aljabar ternyata begitu keren.

Minggu ini seperti biasa untuk mengisi waktu luang dan menghilangkan pikiran negatif sekaligus mengimprove skill programming yang semakin lama semakin menyenangkan untuk dipelajari.

Dimulai dengan mencoba kembali mendalami composable arsitektur (Redux -> React Native or Bloc -> Flutter).

Bagaimana sih composable arsitetur ini bekerja ?

Setelah proses browsing di youtube (why youtube ?karena saya manusia visual, saya lebih suka melihat mengamati dari pada membaca) pertama kali yang muncul adalah youtube Fuctional Programming yang sudah saya subscribe sejak lama hanya saja belum coba saya ulik lebih dalam.

Judulnya Brandon Williams — Composable Reducers & Effects Systems. Dalam materi tersebut Brandon menjelaskan bagaimana Reducer bekerja.

Setelah 50 menit menyimak beberapa pertanyaan timbul selain rasa kagum bagaimana dia menjelaskan materi tersebut (Seinget saya mata kuliah aljabar tidak semenyenagkan ini)

Pertanyaan yang muncul antara lain :

  • precedencegroup dalam bahasa Swift
  • infix operator dalam bahasa Swift juga
  • Monoid
  • Endomorpish
  • Lenses
  • Prism

Untuk kali ini kita akan coba belajar mengenal Monoid dulu karena mungkin untuk manusia-manusia juru ketik Swift yang expert sudah paham mengenai precedencegroup dan infix operator.

Oke, apa sih Monoid ?

Mengutip dari Wikipedia : Dalam aljabar abstrak, cabang matematika, monoid adalah himpunan kompleks dengan asosiatifoperasi biner dan elemen identitas.

Paham ?Nggak kan ? sama …

Oke akhirnya berakhir ke browsing kembali dan menemukan youtube Tsoding yang berjudul How Monoids are useful in Programming?. Pada sesi tersebut Tsoding menjelaskan bagaimana twitch chat filter bekerja.

  1. Pertama untuk membuat hal tersebut dia memerlukan fuction yang mengambil char sebagai input dan mengembalikan boolean (Apakah char tersebut forbidden atau tidak)
  2. Selanjutnya berarti kita harus mendefiniskan char apa yang boleh dan tidak boleh (isForbidden fuction dan fuction isForbidden merupakan kumpulan fuction isBraille, isEmoji)
  3. Berarti kita bisa menyebut isBraille dan isEmoji sebagai predicate dan merupakan kumpulan predicates(array[isBraille,isEmoji]) yang bisa kita satukan menjadi sebuah single predicate. Why ?karena akan lebih mudah kita maintenace ketika kita akan menambah atau menghapus predicate baru sesuai kebutuhan.
  4. Nah dalam video tersebut Tsoding menjelaskan kita bisa membuat chaining function yang mereturn kembali function predicate tersebut (Binary Operation). Kemudian dia bilang disebut apa Binary Operation yang dilakukan atau dieksekusi pada waktu yang bersamaan ?Yes Monoid. Sayang nya nggak semua bisa dikatakan Monoid karena Monoid harus mereturn Monoid agar bisa di Mappend.

Oke next kita lanjutkan ke video lain Monoids, Predicates and Sorting Functions! — Brandon Williams. Monoid ternyata tidak bisa lepas dari Groupoid dan Semigroup.

Oke sebelum masuk lebih dalam kita harus paham mengenai ketiganya

  • Groupoid adalah himpunan (G) yang dilakukan operasi (*) dan harus Tertutup, yang dimaksud tertutup disini adalah jika G adalah himpunan bilangan bulat dan dilakukan operasi biner penjumlahan maka akan menghasilkan bilangan bulat juga sehingga bisa dikatakan tertutup (G(Bilangan Bulat),*(+)).
  • Semigroup, untuk bisa dikatakan semigroup dia tidak hanya tertutup tapi juga harus asosiatif. Asosiatif adalah operasi biner yang tidak akan mengubah hasil ketika tanda kurung diatur ulang (Wikipedia).
  • Monoid, jika semigroup harus tertutup dan asosiatif maka monoid juga harus mempunyai identitas. Apa itu Sifat Identitas ? merupakan sifat operasi suatu bilangan yang hasilnya bilangan itu sendiri. (Untuk perkalian 1 adalah elemen netral karena bilangan apapun jika dikali 1 akan menghasilkan bilangan tersebut, sedangkan penjumlahan dan pengurangan elemen netral nya 0).

Kesimpulan Sementara

  • Monoid merupakan Semigroup yang memiliki identitas
  • Semigroup merupakan Groupoid yang asosiatif

Semigroup

infix operator <>: AdditionPrecedence
protocol Semigroup {
static func <> (lhs: Self, rhs: Self) -> Self
}
extension Int: Semigroup {
static func <> (lhs: Int, rhs: Int) -> Int {
return lhs + rhs
}
}
extension Array: Semigroup {
static func <> (lhs: Array, rhs: Array) -> Array {
return lhs + rhs
}
}
extension String: Semigroup {
static func <> (lhs: String, rhs: String) -> String {
return lhs + rhs
}
}
extension Bool: Semigroup {
static func <> (lhs: Bool, rhs: Bool) -> Bool {
return lhs && rhs
}
}
func concat<S: Semigroup>(_ G: [S], _ initial: S) -> S {
return G.reduce(initial, <>)
}

Monoid

protocol Monoid: Semigroup {
static var e: Self { get }
}
extension Int: Monoid {
static let e = 0
}
extension Array: Monoid {
static var e: Array {
return []
}
}
extension String: Monoid {
static let e = ""
}
extension Bool: Monoid {
static let e = true
}
func concat<M: Monoid>(_ G: [M]) -> M {
return G.reduce(M.e, <>)
}

Endomorphism

Selanjutnya untuk mengeksekusi predicate secara bersamaan kita butuh Endmorphism. Apa sih itu ?Yaitu perubahan bentuk dimana disini bentuknya function ke bentuk function itu sendiri (sesuai dengan namanya morph)

struct Endo<A>: Monoid {
let call: (A) -> A
static var e: Endo<A> {
return Endo{ $0 }
}
static func <> (lhs: Endo<A>, rhs: Endo<A>) -> Endo<A> {
return Endo { rhs.call(lhs.call($0)) }
}
}

Contoh :

let incr = Endo<Int> { $0 + 1 } // incr adalah predicatelet square = Endo<Int> { $0 * $0 } // square adalah predicatelet mod3 = Endo<Int> { $0 % 3 } // mod3 adalah predicateconcat([incr, square, mod3]).call(3)3 akan di increment 1 = 4
4 akan di square = 16
16 akan di mod3 = 1
hasil nya adalah 1

Kesimpulan

Dengan monoid kita bisa memfilter, sorting dan juga memvalidasi sebuah object atau himpunan. Next mungkin akan melanjutkan mengenai sort dengan predicate sesuai dengan video nya Brandon Williams.

--

--

No responses yet