Rumah  >  Artikel  >  hujung hadapan web  >  Asas Pengaturcaraan Fungsian

Asas Pengaturcaraan Fungsian

DDD
DDDasal
2024-09-26 12:46:42166semak imbas

Fundamentals of Functional Programming

pengenalan

Pengaturcaraan fungsian (FP) bukan sekadar paradigma pengaturcaraan; ia adalah cara berfikir yang berbeza tentang kod. Berakar umbi dalam fungsi matematik, FP menekankan penilaian ungkapan dan bukannya pelaksanaan arahan. Semasa kami menelusuri konsep teras FP, anda akan menemui cara pendekatan ini boleh membawa kepada kod yang lebih boleh diramal, boleh diselenggara dan selalunya lebih ringkas.

Konsep Teras Pengaturcaraan Fungsian

1. Fungsi Tulen

Di tengah-tengah pengaturcaraan berfungsi terletak konsep fungsi tulen. Fungsi tulen ialah:

  • Sentiasa mengembalikan output yang sama untuk input yang sama
  • Tiada kesan sampingan
// Pure function
const add = (a, b) => a + b;

// Impure function (relies on external state)
let total = 0;
const addToTotal = (value) => {
  total += value;
  return total;
};

Fungsi tulen boleh diramal dan lebih mudah untuk diuji, nyahpepijat dan diselaraskan.

2. Ketidakbolehubah

Ketidakbolehubahan ialah amalan tidak menukar data sebaik sahaja ia dibuat. Daripada mengubah suai data sedia ada, kami mencipta struktur data baharu dengan perubahan yang diingini.

// Mutable approach
const addItemToCart = (cart, item) => {
  cart.push(item);
  return cart;
};

// Immutable approach
const addItemToCart = (cart, item) => [...cart, item];

Ketidakbolehubahan membantu mencegah kesan sampingan yang tidak diingini dan menjadikannya lebih mudah untuk menjejaki perubahan dalam aplikasi anda.

3. Fungsi Kelas Pertama dan Pesanan Tinggi

Dalam FP, fungsi dianggap sebagai warga kelas pertama, bermakna mereka boleh:

  • Ditugaskan kepada pembolehubah
  • Diluluskan sebagai hujah kepada fungsi lain
  • Dikembalikan daripada fungsi

Fungsi yang beroperasi pada fungsi lain dipanggil fungsi tertib lebih tinggi.

// Higher-order function
const withLogging = (fn) => {
  return (...args) => {
    console.log(`Calling function with args: ${args}`);
    return fn(...args);
  };
};

const add = (a, b) => a + b;
const loggedAdd = withLogging(add);

console.log(loggedAdd(2, 3)); // Logs: Calling function with args: 2,3
                              // Output: 5

Konsep ini membenarkan abstraksi yang berkuasa dan penggunaan semula kod.

4. Komposisi Fungsi

Gubahan fungsi ialah proses menggabungkan dua atau lebih fungsi untuk menghasilkan fungsi baharu. Ia merupakan teknik asas dalam FP untuk membina operasi yang kompleks daripada yang lebih mudah.

const compose = (f, g) => (x) => f(g(x));

const addOne = (x) => x + 1;
const double = (x) => x * 2;

const addOneThenDouble = compose(double, addOne);

console.log(addOneThenDouble(3)); // Output: 8

5. Rekursi

Walaupun tidak eksklusif untuk FP, rekursi sering diutamakan berbanding lelaran dalam pengaturcaraan berfungsi. Ia boleh membawa kepada penyelesaian yang lebih elegan untuk masalah yang mempunyai sifat rekursif.

const factorial = (n) => {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
};

console.log(factorial(5)); // Output: 120

6. Deklaratif vs Imperatif

Pengaturcaraan fungsional mengutamakan gaya deklaratif, memfokuskan pada perkara yang perlu dilakukan dan bukannya cara melakukannya.

// Imperative
const doubleNumbers = (numbers) => {
  const doubled = [];
  for (let i = 0; i < numbers.length; i++) {
    doubled.push(numbers[i] * 2);
  }
  return doubled;
};

// Declarative
const doubleNumbers = (numbers) => numbers.map(n => n * 2);

Pendekatan deklaratif selalunya lebih ringkas dan lebih mudah difahami sepintas lalu.

Konsep Lanjutan

7. Karipap

Kari ialah teknik menterjemah fungsi yang mengambil berbilang argumen ke dalam urutan fungsi, masing-masing mengambil satu hujah.

const curry = (fn) => {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      }
    }
  };
};

const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);

console.log(curriedAdd(1)(2)(3)); // Output: 6
console.log(curriedAdd(1, 2)(3)); // Output: 6

Karipap boleh membawa kepada definisi fungsi yang lebih fleksibel dan boleh digunakan semula.

8. Fungsi dan Monad

Ini adalah konsep yang lebih maju dalam FP, selalunya digunakan untuk mengendalikan kesan sampingan dan pengiraan berurutan.

  • Fungsi ialah jenis yang boleh dipetakan.
  • Monad ialah jenis yang mentakrifkan cara sesuatu fungsi boleh digunakan padanya.
// Simple Functor example (Array is a Functor)
const double = x => x * 2;
console.log([1, 2, 3].map(double)); // Output: [2, 4, 6]

// Simple Monad example (Promise is a Monad)
Promise.resolve(21)
  .then(double)
  .then(console.log); // Output: 42

Kesimpulan

Pengaturcaraan fungsional menawarkan set alat dan konsep yang berkuasa untuk menulis kod yang bersih, boleh diselenggara dan teguh. Dengan menerima fungsi tulen, kebolehubahan dan prinsip teras lain yang telah kami terokai, anda boleh mencipta program yang lebih mudah untuk difikirkan dan kurang terdedah kepada pepijat.

Walaupun mungkin mengambil sedikit masa untuk menyesuaikan diri dengan minda berfungsi, terutamanya jika anda datang daripada latar belakang yang penting, faedah dalam kualiti kod dan produktiviti pembangun boleh menjadi besar. Semasa anda meneruskan perjalanan anda dalam pengaturcaraan berfungsi, ingat bahawa ini bukan tentang mematuhi setiap prinsip secara ketat sepanjang masa, tetapi lebih kepada memahami konsep ini dan menerapkannya dengan bijak untuk menambah baik kod anda.

Selamat pengaturcaraan berfungsi!

Bacaan Selanjutnya

  • Panduan Profesor Frisby yang Selalunya Mencukupi untuk Pengaturcaraan Berfungsi
  • JavaScript Ringan Berfungsi

Atas ialah kandungan terperinci Asas Pengaturcaraan Fungsian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn