Asas Pengaturcaraan Fungsian

DDD
Lepaskan: 2024-09-26 12:46:42
asal
291 orang telah melayarinya

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;
};
Salin selepas log masuk

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];
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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);
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan