Hanya karena fungsi adalah objek kelas satu, ada closure, dan fungsi tingkat tinggi, apakah Javascript pantas disebut sebagai bahasa Pemrograman Fungsional? Hal utama yang menurut saya kurang adalah Fungsi Murni, dan tidak 'terasa' seperti bahasa fungsional lainnya, seperti cadel (meskipun itu bukan alasan yang baik untuk tidak menjadi bahasa fungsional ...)
javascript
functional-programming
terminology
hvgotcodes
sumber
sumber
Jawaban:
Mengulangi jawaban saya sendiri untuk pertanyaan serupa,
sumber
Saya akan mengatakan bahwa ini adalah bahasa multi-paradigma.
EDIT: Ini multi-paradigma dan termasuk konstruksi fungsional.
sumber
jika Anda merentangkan dan memelintir istilah "pemrograman fungsional" ke titik diskusi filosofis, pertanyaan ini mungkin terbuka lagi. Namun, kemudian Anda berakhir pada level pertanyaan berguna seperti "Apakah C ++ benar-benar bahasa pemrograman"?
Jawaban atas pertanyaan Anda pada level harian lainnya adalah "tidak" .
Pemrograman fungsional berarti bahwa program dikonseptualisasikan sebagai evaluasi fungsi, bukan aliran kontrol. Kode ini adalah deskripsi fungsi, dan tidak memiliki konsep aliran kontrol yang melekat.
JavaScript memiliki aliran kontrol dan dikonseptualisasikan sebagai bahasa imperatif. Dari tujuan desainnya, jelas ini bukan bahasa fungsional.
sumber
Istilah bahasa "pemrograman fungsional" sangat berlebihan akhir-akhir ini sehingga hampir tidak berguna. Ada dua arti dominan:
Pilih makna Anda dan kemudian pertanyaannya bisa dijawab.
sumber
Saya tidak berpikir ada definisi konkret dari pemrograman fungsional, namun banyak hal yang orang anggap sebagai "pemrograman fungsional" dapat dilakukan dengan javascript. Berikut adalah contoh singkat yang bagus di artikel ini .
sumber
Bagi saya, Javascript adalah bahasa imperatif dan bahasa fungsional, dan Anda dapat memilih untuk menggunakannya dengan cara apa pun, dan bahkan ( egad ) keduanya. Atau Anda dapat memilih untuk menggunakan satu paradigma dan tidak pernah menyentuh yang lain. Terserah kamu. Saya, seperti Anda, tidak berpikir Javascript harus disebut Bahasa Fungsional, karena memungkinkan Anda untuk masuk dan keluar dari paradigma pemrograman fungsional. Mungkin jika itu memiliki semacam pragma, untuk membatasi Anda hanya dengan menggunakan paradigma pemrograman fungsional, maka itu akan berguna, saya kira. Namun, secara ringkas, saya mengatakan ini lebih merupakan bahasa imperatif / prosedural dengan beberapa fitur pemrograman fungsional yang dilemparkan.
sumber
Saya cenderung tidak menganggap bahasa pemrograman memiliki satu paradigma tertentu, tetapi mereka meminjamkan diri ke paradigma tertentu. Namun, hanya karena mereka meminjamkan diri pada paradigma tertentu tidak berarti Anda harus menggunakan paradigma itu. Sangat mungkin untuk menulis program berorientasi objek dalam C dan menulis program penting dalam ML. Tidak menggunakan paradigma tertentu untuk menyelesaikan suatu masalah karena bahasanya tidak dirancang untuk itu hanya membatasi diri Anda sendiri secara artifisial (tentu saja Anda harus tetap mempertimbangkan keterbatasan bahasa saat memutuskan apakah solusi tertentu akan menjadi solusi yang baik).
sumber
Yah, saya tidak akan mengatakan itu pemrograman fungsional, tetapi kemudian saya akan mengatakan itu berorientasi objek dan baru hari ini seorang teman mengatakan dia juga tidak akan meletakkannya di rak itu.
Jadi, meskipun saya tidak akan mengatakannya, saya rasa masih ada ruang untuk opini. Itu memang memiliki fitur klasik dari pemrograman fungsional, tidak ada yang lain.
sumber
Javascript benar. Itu benar-benar tergantung pada bagaimana Anda memprogramnya. Jika saya membuat kode dengan cara OO, bukankah itu menjadi OO? Jadi, jika Anda hanya membuat kode dengan cara 'fungsional', itu akan berfungsi. Saya kira ini adalah bahasa multi-paradigma jadi menyebutnya hanya satu hal tidak sepenuhnya akurat.
sumber
@petraszd Saya menulis ulang kode Anda sedikit untuk mendapatkan "baru" untuk operator:
function ffor(a, b, f){ function it(i){ if(i > b)return f(i) it(i+1) } it(a) } print("----" + new Date()+"----") var funcs = [] ffor(0, 9, function(i){ funcs.push(function(){return i}) }) ffor(0, 9, function(i){ print(funcs[i]()) })
Tetapi saya tahu bahwa cara ini memiliki kelemahan untuk loop besar ...
Pertanyaan terkait tentang pengoptimalan rekursi ekor di JS
PS Diposting di sini karena bermasalah dengan pemformatan kode saat memposting sebagai komentar
sumber
Dalam Javascript, Anda dapat melakukan sesuatu seperti ini !!
// Data var fruits = [ { name: 'apple', price: 5 }, { name: 'orange', price: 10 }, { name: 'lemon', price: 15 } ] // Request Data from magicURL request('magicURL') .then(selectKeyOf('price')) .then(priceMethod('sum')) .then((result)=>{ console.log(result) // 30 })
Saya telah membuat halaman github untuk mendemonstrasikan konsep ini dan Anda dapat mengkloning / melihat implementasi saya
sumber
Seperti yang kita ketahui bahasa pemrograman fungsional tidak memungkinkan untuk mengubah atau mengubah elemen (status) dari fungsi tetapi dalam javascript diperbolehkan dalam arti itu bukan bahasa pemrograman fungsional, meskipun ia memperlakukan fungsi sebagai warga kelas satu.
sumber
Yang benar-benar saya benci di javascript (jika Anda mencoba melihatnya sebagai bahasa FP) adalah ini:
function getTenFunctionsBad() { var result = []; for (var i = 0; i < 10; ++i) { result.push(function () { return i; }); } return result; } function getTenFunctions() { var result = []; for (var i = 0; i < 10; ++i) { result.push((function (i) { return function () { return i; } })(i)); } return result; } var functionsBad = getTenFunctionsBad(); var functions = getTenFunctions() for (var i = 0; i < 10; ++i) { // using rhino print print(functionsBad[i]() + ', ' + functions[i]()); } // Output: // 10, 0 // 10, 1 // 10, 2 // 10, 3 // 10, 4 // 10, 5 // 10, 6 // 10, 7 // 10, 8 // 10, 9
Anda perlu memahami lingkungan tumpukan JS (saya tidak, jika istilah yang tepat) untuk memahami perilaku seperti itu.
Dalam skema misalnya Anda tidak bisa menghasilkan hal seperti itu (Ok, ok - dengan bantuan referensi bahasa yang mendasarinya Anda bisa membuatnya):
(define (make-ten-functions) (define (iter i) (cond ((> i 9) '()) (else (cons (lambda () i) (iter (+ i 1)))))) (iter 0)) (for-each (lambda (f) (display (f)) (newline)) (make-ten-functions))
sumber