Bagikan ke: Twitter | Facebook | LinkedIn
Daftar isi
Pendahuluan
Monad pertama kali saya dengar ada pada bahasa program yang memiliki paradigma fungsional bersih, yang artinya bahasa yang semuanya adalah imutable atau tidak dapat diubah, disinilah monad sangat berguna dimana kita membuat sebuah state baru dan kita memindakhan state sekarang ke state yang baru tanpa mengubah sebuah state, inilah di bahasa fungsional yang bersih dapat mencetak sebuah huruf/angka di terminal.
Monad
monad adalah monoid dalam kategori endofunctor, apa masalahnya ?
sebuah kata kata yang diucapkan oleh Philip Wadler saat ditanya apa itu monad dan dalam sebuah buku yang berjudul “Categories for the working mathematician” yang ditulis oleh Saunders Mac Lane di halaman 138 menjelaskan monad,
“Monad in X is just a monoid in the category of endofunctors of X, with product x replaced by composition of endofunctors and unit set by the identity endofunctor”
atau dalam bahasa indonesia
“Secara keseluruhan, Monad di X hanyalah Monid dalam Kategori EndoFunctors X, dengan produk x diganti dengan komposisi endofunctors dan unit yang ditetapkan oleh identitas EndoFunctor”
dari pernyataan itu kita harus mebedah satu-satu apa itu monoid, category theory dan endofunctor
Monoid
monoid adalah Himpunan seperti n = [1, 2, 3..], operasi biner [+, -, *, /] atau himpunan elemen himpunan dan identitas n + 0 = n atau 0 + n = n
contoh lain seperti 1+2+3+4 , ini juga merupakan monoid karna jika kita mengaplikasikan seperti (1+(2+(3+4))) atau (((1+2)+3)+4) maka hasil yang diberikan tetaplah sama.
Category
category, secara singkat kategori adalah kumpulan dari himpunan, seperti kelas pada Pemrograman Berorientasi Objek, seperti inilah contohnya :
class People {
private String name;
private Integer age;
public void doubleAge() {
this.age * 2;
}
public void minusAge() {
this.age -= 2;
}
}
Functor
functor adalah fungsi yang mengambil sebuah kategori ke kategori lainnya
EndoFunctor
Endo memiliki arti didalam, maka bila digabungkan dengan Functor maka EndoFunctor adalah sebuah fungsi atau category yang mengaplikasikan ke dirinya sendiri
Apa itu Monad
dari pengertian diatas maka Monad adalah sekumpulan fungsi yang mengubah sekumpulan data. Secara khusus data memiliki struktur yang terdefinisi dengan baik, dan Monad adalah kumpulan fungsi yang memetakan data tersebut ke dalam variasi struktur aslinya melalui komposisi fungsi.
Contoh dalam Bahasa Program
beberapa orang akan mudah memahami dalam bentuk contoh, maka dari itu saya akan memberikan contoh monad dalam bahasa program
Haskell
di haskell, monad adalah cara untuk mengubah keadaan internal dari beberapa konteks tanpa mengubah konteks itu sendiri
seperti kira-kira inilah kode monad dalam dalam haskell
data Context A = ...
return :: A -> COntext A
(>>=) :: Context A -> (A -> Context B) -> Context b
bila saya perhatikan dalam logo haskell terdapat sebuah monad yaitu
>>=
dalam sebuah maybe
atau options
dalam bahasa lain juga merupakan
monad, di haskell seperti inilah bentuk kode dari maybe
:
Data Maybe a = Nothing | Just a deriving (Eq, Ord)
instance Monad Maybe where
Nothing >>= F() = Nothing
Just val >>= F () = F val
seperti yang sudah saya jelaskan sebelumnya haskell dapat mencetak data ke layar dengan bantuan monad, caranya adalah IO membungkus seluruh status program ke dalam konteks tunggal dalam Konteks ini kita tidak memiliki apa pun yang dicetak di layar, lalu kami mendefinisikan fungsi yang membawa konteks kita ke dalam konteks baru atau sesuatu yang dicetak ke layar
seperti ini contohnya cara mencetak sesuatu dilayar :
main :: IO ()
= getLine >>=
main -> readFile filename >>=
\filename -> putStrLn cintents \contents
haskell juga memiliki sebuah syntactic sugar agar kita tidak harus
mengetik >>=
dengan menggunakan do
block, kode diatas dapat ditulis
seperti ini :
main :: IO ()
= do
main <- getLine
filename <- readFile filename
contets putStrLn contets
Java
semenjak kira-kira versi java 8 keatas java mulai mensupport paradigma fungsional, seperti inilah contohnya :
Array.asList(1,2,3)
.stream()
.map(n -> new int[] {n+1, n*2})
.collect(Collectors.tolist())
Daftar Pustaka
Blogspot
→ A Brief, Incomplete, and Mostly Wrong History of Programming LanguagesYoutube
→ Okay but WTF is a MONAD?????? #SoME2
→ A Sensible Introduction to Category Theory
→ FunctorsCommunity LYAH
→ Community Learn You a HaskellOracle Docs
→ Java stream APIXmobar
→ Xmobar tutorial