- Apakah Javascript adalah bahasa fungsional? Saya tahu ia memiliki objek & Anda juga dapat melakukan OOP, tetapi apakah ini juga merupakan bahasa fungsional, dapatkah digunakan dengan cara itu?
- Anda tahu bagaimana OOP menjadi / tampak seperti evolusi berikutnya dalam pemrograman, apakah itu berarti bahwa 'Pemrograman Fungsional' adalah evolusi berikutnya (Catatan: ini BUKAN prompt untuk pendapat. TAPI prompt untuk jawaban berdasarkan bukti faktual, & catatan ini adalah lebih banyak untuk moderator daripada kontributor;)).
- Saya belajar paling baik melalui contoh-contoh, mungkin seseorang dapat menunjukkan melakukan tugas yang sama dengan cara OOP & kemudian dengan cara Pemrograman Fungsional bagi saya untuk memahami & membandingkan apa yang pemrograman fungsional lakukan / adalah.
Saya tidak benar-benar sepenuhnya memahami 'Pemrograman Fungsional' jujur: P Jadi membandingkan Javascript dengan pemrograman fungsional mungkin sama sekali salah.
Untuk menempatkan pemrograman Fungsional dalam istilah awam: apakah itu hanya manfaat abstrasi MELALUI menggunakan fungsi anonim?
Atau apakah itu terlalu sederhana? Secara sederhana, OOP adalah manfaat dari abstraksi melalui objek, tapi saya percaya itu agak terlalu sederhana untuk menggambarkan OOP.
Apakah ini contoh yang baik dari pemrograman fungsional? ...
Contoh Javascript OOP:
// sum some numbers
function Number( v )
{
this.val = v;
}
Number.prototype.add( /*Number*/ n2 )
{
this.val += n2.val;
}
Contoh pemrograman fungsional:
function forEach(array, action)
{
for (var i = 0; i < array.length; i++)
action(array[i]);
}
function add(array)
{
var i=0;
forEach(array, function(n)
{
i += n;
});
return i;
}
var res = add([1,9]);
Or is that way too simple?
Ya, benar. Fungsi anonim kadang-kadang dikaitkan dengan bahasa fungsional dan bahasa multi-paradigma yang mendukung pemrograman fungsional, tetapi mereka bukan karakteristik unik dari bahasa fungsional. Tetapi jika Anda melihatnya sebagai implementasi kalkulus λ, yah mereka adalah bagian inti dari pemrograman fungsional, poin utamanya adalah bahwa itu tidak begitu sederhana :)I know it has objects & you can do OOP with it also
Tidak, kamu tidak bisa. Ini pemrograman berbasis prototipe yang menghilangkan perbedaan antara kelas dan objek. Secara pribadi saya menganggap pemrograman berbasis prototipe cacat pada tingkat dasar ini.Jawaban:
Terkadang, orang akan mengatakan pemrograman fungsional, ketika yang mereka maksud adalah pemrograman imperatif atau pemrograman prosedural . Sebenarnya, pemrograman fungsional adalah:
Meskipun Javascript tidak dikenal secara luas atau digunakan sebagai bahasa fungsional, Javascript memiliki beberapa elemen fungsional :
Skema adalah dialek Lisp , dan mungkin salah satu bahasa yang dipikirkan sebagian besar programmer ketika mereka membahas pemrograman fungsional. Ketika datang ke orientasi objek , Javascript adalah bahasa yang berorientasi objek. Tetapi orientasi objeknya adalah berdasarkan prototipe :
Jadi walaupun Javascript berorientasi objek, ia tidak mengikuti model berbasis kelas yang lebih umum , seperti halnya bahasa seperti C ++, C #, Java dan PHP (dan beberapa lainnya). Dan tentu saja itu juga bahasa yang sangat penting, yang mengarah pada kebingungan dengan pemrograman fungsional yang saya jelaskan di atas.
Orientasi objek dan pemrograman fungsional hanyalah dua dari banyak paradigma pemrograman yang berbeda , mereka adalah gaya pemrograman yang berbeda dengan konsep dan abstraksi yang berbeda. Kata kuncinya adalah "berbeda". Tidak ada paradigma tunggal yang lebih baik daripada yang lain atau lebih berkembang daripada yang lain, masing-masing dan setiap skenario cocok lebih baik dari yang lain. Beberapa mungkin lebih tua asalnya daripada yang lain, tetapi dalam istilah evolusi yang membuat mereka lebih baik, karena mereka telah bertahan lebih lama. Tapi itu bukan cara yang sangat cerdas untuk melihatnya.
Javascript, seperti yang saya jelaskan di atas dan beberapa bahasa lainnya, multi-paradigma. Hal ini memungkinkan Anda untuk menulis kode dalam gaya imperatif, berorientasi objek dan gaya fungsional. Terserah Anda untuk memilih mana yang paling cocok untuk apa pun yang Anda bangun. Ada juga beberapa bahasa paradigma tunggal, contoh kanonik adalah Java, yang hanya memungkinkan untuk pemrograman berorientasi objek berbasis kelas 1 .
Anda harus benar-benar menahan keinginan untuk memperlakukan bahasa & paradigma sebagai pernyataan mode. Ada banyak omong kosong di luar sana, kebanyakan ditulis oleh fanboys / fangirls atau orang pemasaran, dengan sedikit (jika ada) pengetahuan dan pemahaman pemrograman. Istilah seperti "lebih baik", "lebih berkembang" dll, tidak berlaku.
Itu akan menjadi cara yang buruk untuk belajar. Orientasi fungsional dan objek adalah gaya yang sangat berbeda, dan contoh apa pun selain yang sangat sederhana tidak akan cocok dengan satu atau gaya lainnya.
1 Tetapi belakangan mencoba memperluas cakupannya ke pemrograman generik, mari kita lihat bagaimana kelanjutannya.
Kesimpulannya:
sumber
Javascript dapat digunakan sebagai bahasa fungsional, bahkan ia melakukannya dengan cukup baik. Dimungkinkan untuk mengimplementasikan monads yang memiliki dukungan untuk konstruk lambda dll. Ini tidak secara eksklusif merupakan bahasa fungsional karena ia juga memiliki banyak fitur berorientasi objek tetapi dapat digunakan dengan cara itu. Sebenarnya saya menemukan bahwa menggunakan Javascript sebagai bahasa fungsional adalah cara yang bagus untuk menggunakannya. (Contoh jQuery dan underscore.js)
sumber
Evolusi biasanya berarti perubahan bertahap . OOP bukan tambahan tambahan untuk pemrograman prosedural - pada kenyataannya, itu sepenuhnya ortogonal untuk model pemrograman yang mendasarinya dan dapat dikombinasikan dengan salah satu dari mereka. Pemrograman fungsional bukan merupakan tambahan tambahan untuk prosedural, OOP atau apa pun - itu adalah alternatif dasar untuk mengekspresikan prinsip-prinsip komputasi yang mendasar, dan itu sebenarnya pertama dasar seperti yang pernah dirumuskan, jauh sebelum komputer pertama kali muncul. Penting untuk dipahami bahwa semua sistem fundamental semacam itu setara (yaitu, satu dapat diekspresikan dalam bentuk yang lain).
Untuk memahami pendekatan fungsional, Anda harus mendapatkan matematika dasar terlebih dahulu. Jika Anda ingin mengetahui apa artinya kode dalam gaya fungsional dalam Javascript, mulailah menggunakan jQuery .
sumber
Tidak.
JavaScript adalah bahasa berorientasi objek pertama dan terutama.
Itu bukan untuk mengatakan bahwa Anda tidak dapat menulis program JavaScript dalam gaya fungsional, karena Anda dapat mengadopsi gaya fungsional di setiap Turing bahasa yang lengkap jika Anda mencoba cukup keras. Anda dapat melakukan pemrograman fungsional dalam assembler jika Anda suka. Tetapi ini tidak membuat setiap bahasa berfungsi. Anda mungkin juga sama-sama memanggil Haskell imperative, atau Java bahasa pemrograman logika - jika Anda mengambil pendekatan ini, istilah itu akan segera menjadi tidak berarti.
IMO cara untuk mengklasifikasikan bahasa ke dalam paradigma yang sesuai adalah dengan mempertimbangkan:
Secara pribadi saya merasa agak lucu bahwa banyak orang suka mengklaim bahasa adalah "fungsional" hanya karena itu adalah istilah yang trendi saat ini :-)
Jika Anda ingin perspektif yang sedikit panjang namun menghibur tentang paradigma pemrograman selama bertahun-tahun, ada baiknya menonton video Paman Bob Martin "The Last Programming Language" . Bagi saya wawasan besar dari pembicaraan ini adalah bahwa paradigma pemrograman ditentukan oleh fitur apa yang mereka ambil , bukan fitur apa yang mereka masukkan ......
sumber
What is the dominant style enabled by the language constructs
Saya menantang Anda untuk mencoba dan menerapkannya pada Perl ... Atau poin Anda yang lain, sungguh :)Javascript adalah prototypal pertama, dengan kemampuan fungsional - yang diberikan oleh penggunaan fungsi sebagai objek kelas satu.
Ini berarti bahwa Anda dapat menggunakan fungsi sebagai data, yang memiliki efek aneh mengurangi kebutuhan variabel yang mempertahankan status. Jika Anda menemukan diri Anda meraih pernyataan var, atau menggunakan satu atau lebih pernyataan "jika", maka Anda menyimpang dari gaya fungsional.
Keistimewaan lain yang menonjol dari gaya fungsional adalah bahwa fungsi HANYA seharusnya mengembalikan hasil evaluasi mereka dan tidak memiliki efek samping pada keadaan di luar ruang lingkup mereka:
Bahasa fungsional bersifat non-destruktif - artinya mereka tidak mengubah input, tetapi mengembalikan data yang sepenuhnya baru berdasarkan input. Lihat utas ini: https://stackoverflow.com/questions/749084/jquery-map-vs-each
Bahasa fungsional juga menampilkan banyak metode yang sama - dengan nama-nama seperti "peta", "lipat", "kurangi" yang memproses daftar / koleksi. Dalam JS, tidak seperti bahasa lain, kita harus mengangkat ini menjadi ada - lihat perpustakaan seperti underscore.js untuk beberapa contoh, meskipun implementasi terbaru JS memiliki beberapa di antaranya.
Yang penting untuk diingat (IMO) adalah bahwa sementara JS dapat memanfaatkan beberapa pola fungsional, itu tidak selalu dilengkapi dengan baik untuk melaksanakannya.
Ambil iterasi di atas array, misalnya. Anda dapat melakukan ini menggunakan gaya fungsional atau konstruksi loop asli - dan secara umum loop lebih performan. Ambil contoh ini - pukul dengan loop dengan ukuran yang semakin besar dan catat waktu eksekusi di browser yang berbeda (saya sudah melakukan ini, tapi saya kehilangan tolok ukur - maaf!):
Selain itu, jika Anda menggunakan konstruksi fungsional untuk menekan loop dengan ukuran yang cukup besar dan tidak menggunakan beberapa bentuk manajemen tumpukan ad-hoc, Anda dapat membanjiri tumpukan (meskipun, agar adil, Anda memerlukan daftar BESAR untuk ini terjadi. ..) Anda juga harus memasukkan campuran optimisasi varian di setiap browser - meskipun jika Anda bekerja di lingkungan Node.js ini jelas lebih merupakan target tetap.
Itu bukan untuk mengatakan Anda tidak boleh menggunakan konstruksi fungsional dalam Javascript - hanya menyadari keterbatasan dalam penerapannya relatif terhadap lingkungannya.
Berikut ini beberapa tautan yang mungkin menarik bagi Anda:
Bab yang bagus tentang Pemrograman Fungsional dalam Javascript dari "Eloquent Javascript" yang luar biasa
Si Kecil Schemer
seorang teman saya menulis perpustakaan JS berdasarkan Little Schemer
Tutorial Skema yang bagus yang dapat membantu Anda lebih memahami FP
sumber