Bifunctor: Sikat Kanan Kiri
Functor adalah sebuah struktur data yang membungkus value lain, yang strukturnya terjaga (preserved) saat transformasi (map
). Functor hanya dapat membungkus satu value saja, dan hanya satu value ini saja yang dapat diubah ke bentuk lain.
Di contoh ini Tuple adalah struktur data yang memiliki dua buah value, a
dan b
. Namun karena sifat Functor yang hanya bisa mentransformasi satu value saja, kita harus korbankan a
dan kasih jalan ke b
.
Lalu bagaimana jika kita ingin mentransformasi kedua value Tuple?
Pake BIFUNCTOR bro!!
Sante pak.
Oke, alih-alih menerima satu function transformasi saja seperti Functor, Bifunctor menerima dua buah function transformasi sekaligus: yang satu untuk mengubah nilai a
dan yang satunya lagi untuk mengubah nilai b
.
Dengan ini kedua buah value akhirnya bisa ditransformasi.
Contoh lain. Either
.
Pola ini sangat mudah dicerna sehingga bisa kita buatkan typeclass-nya sendiri, yang akan kita namakan Bifunctor
, yang memiliki method bernama bimap
, yang mengambil dua buah function, yang tetap preserve struktur data tersebut, yang yaang bikinin teh dong.
Karena bimap
adalah method dari sebuah typeclass, seseorang gak bisa begitu saja menggunakan method ini. Struktur data yang dimanipulasi harus terlebih dahulu memiliki instance Bifunctor.
Semua struktur data yang memiliki dua buah type paramater dapat dijadikan Bifunctor selama kedua type parameter-nya covariant. Maaf, ini kalimat sebenarnya kopas aja dari sini. Bisa di-skip karena gak peting. Tapi kalau penasaran, saya include gist dari apa yang dimaksud dengan Covariant dan Contravariant 👇🏻
Sekian dan terima kangen.