Saya belajar javascript FP dengan membaca buku DrBoolean .
Saya mencari-cari perpustakaan pemrograman fungsional. Saya menemukan Ramda dan Folktale. Keduanya mengklaim sebagai perpustakaan pemrograman fungsional.
Tapi mereka sangat berbeda:
Ramda tampaknya berisi fungsi utilitas untuk menangani daftar: peta, reduksi, filter, dan fungsi murni: kari, tulis. Itu tidak mengandung apapun yang berhubungan dengan monad, functor.
Namun cerita rakyat tidak mengandung utilitas untuk daftar atau fungsi. Tampaknya menerapkan beberapa struktur aljabar dalam javascript seperti monad: Mungkin, Tugas ...
Sebenarnya saya menemukan lebih banyak perpustakaan, semuanya tampaknya termasuk dalam dua kategori. Garis bawah dan lodash seperti Ramda. Fantasy-land, pointfree-fantasy seperti cerita rakyat.
Dapatkah perpustakaan yang sangat berbeda ini disebut fungsional , dan jika demikian, apa yang membuat setiap perpustakaan fungsional?
sumber
[1,2,3].map(fnSquare).reduce(fnSum)
2. sebagian besar struktur akademis "look ma no var " Y-combinator-esque. 3. menggunakanFunction.prototype
untuk mengubah perilaku fungsi lain, sepertivar isMissingID=fnContains.partial("id").negate();
Jawaban:
Fitur Fungsional
Tidak ada batasan yang jelas tentang apa yang mendefinisikan pemrograman fungsional atau pustaka fungsional. Beberapa fitur bahasa fungsional dibangun ke dalam Javascript:
Yang lainnya mungkin dilakukan dalam Javascript dengan hati-hati:
Yang lain lagi adalah bagian dari ES6, dan sebagian atau seluruhnya tersedia sekarang:
Dan ada banyak lainnya yang benar-benar di luar jangkauan normal Javascript:
Sebuah perpustakaan, kemudian, dapat memilih jenis fitur yang ingin didukungnya dan masih dapat disebut "fungsional".
Spesifikasi negeri fantasi
Fantasy-land adalah spesifikasi untuk sejumlah tipe standar yang ditransfer dari Teori Kategori matematika dan Aljabar Abstrak ke pemrograman fungsional, tipe-tipe seperti Monoid , Functor , dan Monad . Jenis ini cukup abstrak, dan memperluas pengertian yang mungkin lebih dikenal. Functor, misalnya, adalah container yang dapat
map
diayunkan dengan suatu fungsi, seperti caramap
ped over menggunakan arrayArray.prototype.map
.Cerita rakyat
Cerita rakyat adalah kumpulan jenis yang menerapkan berbagai bagian spesifikasi tanah Fantasi dan sekumpulan kecil fungsi utilitas pendamping. Jenis-jenis ini adalah hal-hal seperti Maybe , Either , Task (sangat mirip dengan apa yang di tempat lain disebut Masa Depan, dan sepupu yang lebih sah dari sebuah Janji), dan Validasi
Cerita rakyat mungkin adalah implementasi paling terkenal dari spesifikasi Fantasy-land, dan itu sangat dihormati. Tetapi tidak ada yang namanya implementasi definitif atau default; Fantasy-land hanya menentukan tipe abstrak, dan implementasi tentu saja harus menciptakan tipe konkret seperti itu. Klaim cerita rakyat sebagai pustaka fungsional jelas: ia menyediakan tipe data yang biasanya ditemukan dalam bahasa pemrograman fungsional, yang membuatnya jauh lebih mudah untuk memprogram secara fungsional.
Contoh ini, dari dokumentasi Cerita Rakyat ( catatan : tidak di versi terbaru dari dokumen), menunjukkan bagaimana itu dapat digunakan:
Ramda
Ramda (penafian: Saya salah satu penulis) adalah jenis perpustakaan yang sangat berbeda. Ini tidak memberikan tipe baru untuk Anda. 1 Sebaliknya, ia menyediakan fungsi untuk membuatnya lebih mudah dioperasikan pada tipe yang sudah ada. Itu dibangun di sekitar gagasan menyusun fungsi yang lebih kecil menjadi yang lebih besar, bekerja dengan data yang tidak dapat diubah, untuk menghindari efek samping.
Ramda beroperasi terutama pada daftar, tetapi juga pada objek, dan terkadang pada String. Ia juga mendelegasikan banyak seruannya sedemikian rupa sehingga ia akan beroperasi dengan dongeng atau implementasi tanah Fantasi lainnya. Misalnya,
map
fungsi Ramda , beroperasi mirip dengan yang diArray.prototype
, jadiR.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Tetapi karena FolktaleMaybe
mengimplementasikanFunctor
spesifikasi Fantasy-land , yang juga menentukan peta, Anda juga dapat menggunakan Ramdamap
dengannya:Klaim Ramda sebagai pustaka fungsional terletak pada kemudahan untuk membuat fungsi, tidak pernah mengubah data Anda, dan hanya menyajikan fungsi murni. Penggunaan khas Ramda adalah untuk membangun fungsi yang lebih kompleks dengan membuat yang lebih kecil, seperti yang terlihat dalam artikel tentang filosofi Ramda.
Perpustakaan Lainnya
Itu tidak terlalu akurat. Pertama-tama, Fantasy-land hanyalah spesifikasi yang dapat diputuskan oleh perpustakaan untuk diterapkan untuk berbagai jenis. Cerita rakyat adalah salah satu dari banyak penerapan spesifikasi itu, mungkin yang terbaik, pasti salah satu yang paling matang. Pointfree-fantasy dan ramda-fantasy adalah yang lainnya, dan masih banyak lagi .
Garis bawah dan lodash secara dangkal seperti Ramda karena mereka adalah perpustakaan tas tangan, menyediakan sejumlah besar fungsi dengan kohesi yang jauh lebih sedikit daripada sesuatu seperti Cerita Rakyat. Dan bahkan fungsionalitas tertentu sering tumpang tindih dengan Ramda. Namun secara lebih mendalam, Ramda memiliki perhatian yang sangat berbeda dengan perpustakaan tersebut. Sepupu terdekat Ramda ini mungkin perpustakaan seperti FKit , Fnuc , dan Wu.js .
Bilby termasuk dalam kategorinya sendiri, menyediakan sejumlah alat seperti yang disediakan oleh Ramda dan beberapa jenis yang sesuai dengan Fantasy-land. (Penulis Bilby adalah penulis asli Fantasy-land juga.)
Panggilanmu
Semua perpustakaan ini berhak disebut fungsional, meskipun mereka sangat bervariasi dalam pendekatan fungsional dan tingkat komitmen fungsional.
Beberapa dari perpustakaan ini sebenarnya bekerja sama dengan baik. Ramda harus bekerja dengan baik dengan cerita rakyat atau implementasi tanah fantasi lainnya. Karena keprihatinan mereka hampir tidak tumpang tindih, mereka benar-benar tidak berkonflik, tetapi Ramda berbuat cukup untuk membuat interoperasinya relatif lancar. Ini mungkin kurang benar untuk beberapa kombinasi lain yang dapat Anda pilih, tetapi sintaks fungsi ES6 yang lebih sederhana juga dapat mengurangi kesulitan dalam mengintegrasikan.
Pilihan pustaka, atau bahkan gaya pustaka yang akan digunakan, akan bergantung pada proyek dan preferensi Anda. Ada banyak pilihan bagus yang tersedia, dan jumlahnya terus bertambah, dan banyak di antaranya yang meningkat pesat. Ini saat yang tepat untuk melakukan pemrograman fungsional di JS.
1 Nah, ada proyek sampingan , ramda-fantasi melakukan sesuatu yang mirip dengan apa yang dilakukan Folktale, tetapi itu bukan bagian dari pustaka inti.
sumber
yield
Mempermudah melakukan jenis pemrosesan daftar malas yang dilakukan olehLazy
ataulz.js
. Tapi itu tidak membantu kemalasan tingkat bahasa.someFunc(a + b)
di JS pertama-tama menambahkan nilaia
danb
kemudian memasok hasil itu sebagai parameter ke someFunc. Persamaan di Haskell tidak melakukan itu. Jika fungsi yang dipanggil tidak pernah menggunakan nilai itu, ia tidak akan pernah melakukan penambahan. Jika akhirnya menggunakannya, itu dianggap sebagai ekspresi yang akan dihitung sampai hasilnya dibutuhkan. Jika Anda tidak pernah melakukan apa pun yang akan memaksanya (seperti IO), ia tidak akan pernah benar-benar melakukan penghitungan.