mata teras
Pengaturcaraan berfungsi adalah paradigma atau gaya yang menekankan invarians, fungsi kelas pertama, ketelusan kutipan dan fungsi tulen. Sekiranya anda tidak memahami makna kata -kata ini, jangan risau! Kami akan memecahkan semua istilah ini dalam artikel ini.
Pengaturcaraan berfungsi berasal dari kalkulus λ, sistem matematik yang berkisar sekitar abstraksi dan penyebaran fungsi. Oleh itu, banyak bahasa pengaturcaraan berfungsi kelihatan sangat matematik. Tetapi berita baiknya ialah: anda tidak perlu menggunakan bahasa pengaturcaraan berfungsi untuk memohon prinsip pengaturcaraan fungsional ke kod anda. Dalam jawatan ini, kami akan menggunakan JavaScript, yang mempunyai banyak ciri yang menjadikannya sesuai untuk pengaturcaraan berfungsi tanpa terhad kepada paradigma itu.
Prinsip teras pengaturcaraan berfungsi
Sekarang kita telah membincangkan pengaturcaraan berfungsi, mari kita bincangkan prinsip teras di belakang FP.fungsi tulen
, atau memanipulasi pembolehubah di luar fungsi. console.log
let number = 2; function squareNumber() { number = number * number; // 非纯操作:操作函数外部的变量 console.log(number); // 非纯操作:控制台记录值 return number; } squareNumber();
let number = 2; function squareNumber() { number = number * number; // 非纯操作:操作函数外部的变量 console.log(number); // 非纯操作:控制台记录值 return number; } squareNumber();
fungsi tulen berjalan secara bebas dari negeri di luar fungsi, jadi mereka tidak seharusnya bergantung kepada keadaan global atau pembolehubah di luar diri mereka. Dalam contoh pertama, kami menggunakan pembolehubah number
yang dibuat di luar fungsi dan menetapkannya di dalam fungsi. Ini melanggar prinsip ini. Sekiranya anda sangat bergantung pada perubahan pembolehubah global, kod anda tidak dapat diramalkan dan sukar untuk dijejaki. Ia akan menjadi lebih sukar untuk mengetahui di mana ralat berlaku dan mengapa nilai berubah. Sebaliknya, debugging lebih mudah dengan hanya input, output, dan fungsi pembolehubah tempatan.
Di samping itu, fungsi harus mengikuti ketelusan rujukan , yang bermaksud bahawa diberikan input, output mereka akan selalu sama. Dalam fungsi contoh di atas, jika saya lulus 2 ke fungsi, ia akan sentiasa kembali 4. Ini tidak berlaku dengan panggilan API atau menjana nombor rawak, ini hanya dua contoh. Memandangkan input yang sama, output mungkin atau tidak boleh dikembalikan.
// 纯函数 function squareNumber(number) { return number * number; } squareNumber(2);
Pengaturcaraan fungsi juga mengutamakan Invariability , iaitu, tiada data diubahsuai secara langsung. Invariance membawa ramalan - anda tahu nilai data, dan mereka tidak akan berubah. Ia menjadikan kod mudah, boleh diuji, dan berjalan pada sistem yang diedarkan dan multithreaded.
Invariance sering memainkan peranan apabila kita bekerja dengan struktur data. Banyak kaedah array dalam JavaScript secara langsung mengubah suai tatasusunan. Sebagai contoh, .pop()
memadam item secara langsung dari akhir array, sementara .splice()
membolehkan anda mendapatkan sebahagian daripada array. Sebaliknya, dalam paradigma berfungsi, kami akan menyalin array dan memadam unsur -unsur yang kami mahu menghapuskan dalam proses.
// 不具有引用透明性 Math.random(); // 0.1406399143589343 Math.random(); // 0.26768924082159495
// 我们直接修改 myArr const myArr = [1, 2, 3]; myArr.pop(); // [1, 2]
Dalam pengaturcaraan berfungsi, fungsi kami adalah fungsi kelas pertama, yang bermaksud kita boleh menggunakannya seperti nilai lain. Kita boleh membuat tatasusunan fungsi, lulus mereka sebagai hujah kepada fungsi lain, dan menyimpannya dalam pembolehubah.
// 我们复制数组而不包含最后一个元素,并将其存储到变量中 let myArr = [1, 2, 3]; let myNewArr = myArr.slice(0, 2); // [1, 2] console.log(myArr);
Fungsi pesanan yang lebih tinggi adalah fungsi yang melaksanakan satu daripada dua operasi: mereka sama ada mengambil fungsi sebagai satu atau lebih parameternya atau mengembalikan fungsi tersebut. JavaScript telah membina banyak fungsi pesanan tinggi kelas pertama-seperti map
, reduce
dan filter
, kita boleh menggunakannya untuk berinteraksi dengan tatasusunan.
filter
digunakan untuk mengembalikan array baru dari array lama yang mengandungi hanya nilai yang memenuhi syarat yang kami sediakan.
let myFunctionArr = [() => 1 + 2, () => console.log("hi"), x => 3 * x]; myFunctionArr[2](2); // 6 const myFunction = anotherFunction => anotherFunction(20); const secondFunction = x => x * 10; myFunction(secondFunction); // 200
map
digunakan untuk melangkah ke atas item dalam array dan mengubah suai setiap item mengikut logik yang disediakan. Dalam contoh berikut, kami menggandakan setiap item dalam array dengan meluluskan fungsi yang menguburkan nilai kami dengan 2 hingga map
.
const myArr = [1, 2, 3, 4, 5]; const evens = myArr.filter(x => x % 2 === 0); // [2, 4]
reduce
membolehkan kita mengeluarkan nilai tunggal berdasarkan array input - biasanya digunakan untuk jumlah, array rata -rata, atau nilai kumpulan dalam beberapa cara.
const myArr = [1, 2, 3, 4, 5]; const doubled = myArr.map(i => i * 2); // [2, 4, 6, 8, 10]
Anda juga boleh melaksanakan fungsi ini sendiri! Sebagai contoh, anda boleh membuat fungsi filter
seperti ini:
const myArr = [1, 2, 3, 4, 5]; const sum = myArr.reduce((i, runningSum) => i + runningSum); // 15
Jenis kedua fungsi pesanan tinggi (fungsi yang mengembalikan fungsi lain) juga corak yang agak kerap. Contohnya: Anda juga mungkin berminat dengan kari, jadi anda boleh membacanya! Kombinasi fungsi adalah untuk menggabungkan pelbagai fungsi mudah untuk mewujudkan fungsi yang lebih kompleks. Oleh itu, anda boleh mempunyai fungsi Kelebihan Pengaturcaraan berfungsi menjana kod modular. Anda mempunyai sebilangan kecil fungsi yang boleh anda gunakan berulang kali. Memahami fungsi khusus setiap fungsi bermakna ia harus mudah untuk menentukan kesilapan dan menulis ujian, terutamanya jika output fungsi harus diramalkan. Juga, jika anda cuba menggunakan beberapa teras, anda boleh mengedarkan panggilan fungsi ke teras tersebut, supaya dapat meningkatkan kecekapan pengiraan. Bagaimana menggunakan pengaturcaraan berfungsi? Anda tidak perlu beralih sepenuhnya kepada pengaturcaraan berfungsi untuk mengintegrasikan semua idea ini. Anda juga boleh menggunakan banyak idea dengan pengaturcaraan berorientasikan objek, yang sering dianggap sebagai saingan mereka. Sebagai contoh, React menggabungkan banyak prinsip berfungsi, seperti keadaan yang tidak berubah, tetapi telah menggunakan sintaks kelas terutamanya selama bertahun -tahun. Ia juga boleh dilaksanakan dalam hampir mana -mana bahasa pengaturcaraan - anda tidak perlu menulis Clojure atau Haskell melainkan anda benar -benar mahu. Walaupun anda bukan prinsip pengaturcaraan fungsional, fungsional dapat menghasilkan hasil positif dalam kod anda. soalan yang sering ditanya mengenai pengaturcaraan fungsi Pengaturcaraan berfungsi berdasarkan beberapa prinsip utama. Pertama adalah invarians, yang bermaksud bahawa apabila pembolehubah ditetapkan, ia tidak boleh diubah. Ini menghapuskan kesan sampingan dan menjadikan kod lebih mudah difahami. Prinsip kedua adalah fungsi tulen, yang bermaksud bahawa output fungsi hanya ditentukan oleh inputnya, tanpa sebarang input atau output tersembunyi. Prinsip ketiga adalah fungsi kelas pertama, yang bermaksud bahawa fungsi boleh digunakan sebagai input atau output ke fungsi lain. Ini membolehkan fungsi pesanan lebih tinggi dan menjadikan kod lebih ringkas dan mudah difahami. Perbezaan utama antara pengaturcaraan fungsional dan prosedur adalah cara mereka memproses data dan keadaan. Dalam pengaturcaraan prosedur, negara -negara program disimpan dalam pembolehubah dan boleh diubah dari masa ke masa. Dalam pengaturcaraan berfungsi, keadaan tidak berubah, tetapi mewujudkan keadaan baru dari keadaan yang ada. Ini menjadikan pengaturcaraan berfungsi lebih mudah untuk meramalkan dan debug kerana tidak ada kesan sampingan untuk dibimbangkan. Pengaturcaraan berfungsi menyediakan banyak manfaat. Ia boleh menjadikan kod lebih mudah dibaca dan difahami kerana ia mengelakkan kesan sampingan dan keadaan yang boleh berubah. Ia juga menjadikan kod itu lebih dipercayai, kerana ia menggalakkan penggunaan fungsi tulen yang selalu menghasilkan output yang sama untuk input yang sama. Di samping itu, pengaturcaraan berfungsi boleh menjadikan kod lebih mudah untuk diuji dan debug kerana fungsi boleh diuji secara berasingan. Walaupun pengaturcaraan berfungsi mempunyai banyak faedah, ia juga mempunyai beberapa cabaran. Ia sukar untuk dipelajari, terutamanya bagi orang yang terbiasa dengan pengaturcaraan prosedur atau berorientasikan objek. Melaksanakan algoritma tertentu dalam gaya berfungsi juga boleh menjadi lebih sukar. Tambahan pula, pengaturcaraan berfungsi kadang -kadang membawa kepada kod yang kurang cekap, kerana ia sering melibatkan membuat objek baru dan bukannya mengubah objek sedia ada. Banyak bahasa pengaturcaraan menyokong pengaturcaraan berfungsi sedikit sebanyak. Sesetengah bahasa, seperti Haskell dan Erlang, berfungsi semata-mata, sementara yang lain, seperti JavaScript dan Python, adalah bahasa multi-paradigma yang menyokong pengaturcaraan berfungsi dan paradigma lain. Malah bahasa secara tradisional tidak berkaitan dengan pengaturcaraan berfungsi, seperti Java dan C, telah menambah fungsi untuk menyokong pengaturcaraan berfungsi pada tahun -tahun kebelakangan ini. Dalam pengaturcaraan berfungsi, elakkan kesan sampingan sebanyak mungkin. Ini dilakukan dengan menggunakan fungsi tulen yang tidak mengubah mana -mana negeri atau melaksanakan sebarang operasi I/O. Apabila kesan sampingan diperlukan, mereka terpencil dan dikawal. Sebagai contoh, dalam Haskell, kesan sampingan dirawat dengan monad, yang merangkumi kesan sampingan dan menyediakan cara untuk menghubungkan mereka bersama -sama dengan cara yang terkawal. Fungsi pesanan yang lebih tinggi adalah fungsi yang mengambil satu atau lebih fungsi sebagai parameter, mengembalikan fungsi sebagai hasilnya, atau melakukan kedua-dua operasi pada masa yang sama. Fungsi pesanan maju adalah ciri utama pengaturcaraan berfungsi kerana ia membenarkan fungsi digunakan sebagai data. Ini boleh membawa kepada kod yang lebih bersih dan lebih ekspresif. rekursi adalah teknik di mana fungsi memanggil dirinya dalam definisi sendiri. Dalam pengaturcaraan fungsional, rekursi sering digunakan sebagai pengganti gelung kerana gelung melibatkan keadaan yang boleh berubah, yang dielakkan dalam pengaturcaraan berfungsi. Rekursi boleh digunakan untuk menyelesaikan pelbagai masalah, dari mengira faktorial untuk melintasi pokok. Currying adalah teknik dalam pengaturcaraan berfungsi di mana fungsi dengan pelbagai parameter ditukar menjadi satu siri fungsi, setiap fungsi hanya mempunyai satu parameter. Ini membolehkan sebahagian daripada fungsi digunakan, di mana satu fungsi terpakai kepada beberapa parameternya dan mengembalikan fungsi baru yang mengambil seluruh parameter. Pengaturcaraan Reaktif Fungsi (FRP) adalah paradigma pengaturcaraan yang menggabungkan pengaturcaraan fungsional dan reaktif. Dalam FRP, negara -negara program dimodelkan sebagai satu siri nilai yang tidak berubah yang berbeza dari masa ke masa, dan fungsi digunakan untuk mengubah dan menggabungkan nilai -nilai ini. Ini menjadikannya lebih mudah untuk membuat alasan mengenai program yang tidak segerak dan didorong oleh peristiwa kerana ia mengelakkan keadaan dan kesan sampingan yang boleh dimusnahkan. Atas ialah kandungan terperinci Apakah pengaturcaraan berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!let number = 2;
function squareNumber() {
number = number * number; // 非纯操作:操作函数外部的变量
console.log(number); // 非纯操作:控制台记录值
return number;
}
squareNumber();
Gabungan fungsi
averageArray
yang menggabungkan fungsi purata dengan fungsi jumlah yang merangkumi nilai array. Fungsi individu adalah kecil dan boleh diulang untuk tujuan lain dan digabungkan bersama untuk melakukan kerja yang lebih lengkap. // 纯函数
function squareNumber(number) {
return number * number;
}
squareNumber(2);
Apakah prinsip utama pengaturcaraan berfungsi?
Apakah perbezaan antara pengaturcaraan fungsional dan pengaturcaraan prosedur?
Apakah kelebihan pengaturcaraan berfungsi?
Apakah cabaran pengaturcaraan berfungsi?
Bahasa apa yang menyokong pengaturcaraan berfungsi?
Bagaimana menangani kesan sampingan dalam pengaturcaraan berfungsi?
Apakah fungsi pesanan yang lebih tinggi dalam pengaturcaraan berfungsi?
Apakah rekursi dalam pengaturcaraan berfungsi?
Apa yang dikurangkan dalam pengaturcaraan berfungsi?
Apakah pengaturcaraan reaktif berfungsi?