Rumah >hujung hadapan web >tutorial js >Pengenalan kepada Pengaturcaraan Fungsian dalam JavaScript: Monad dan functors #7

Pengenalan kepada Pengaturcaraan Fungsian dalam JavaScript: Monad dan functors #7

WBOY
WBOYasal
2024-07-18 09:41:19761semak imbas

Introduction to Functional Programming in JavaScript: Monad and functors #7

Monad dan functors ialah konsep lanjutan dalam pengaturcaraan berfungsi yang menyediakan abstraksi berkuasa untuk mengendalikan transformasi data, kesan sampingan dan komposisi. Walaupun ia berasal daripada teori kategori dalam matematik, ia mempunyai aplikasi praktikal dalam bahasa pengaturcaraan seperti JavaScript.

Apakah itu Functor?

Functor ialah jenis data yang melaksanakan kaedah peta, yang menggunakan fungsi pada nilai di dalam functor dan mengembalikan functor baharu dengan nilai yang diubah. Pada dasarnya, functors membenarkan anda menggunakan fungsi pada nilai yang dibalut tanpa mengubah struktur bekas.

Contoh Functor
class Box {
  constructor(value) {
    this.value = value;
  }

  map(fn) {
    return new Box(fn(this.value));
  }
}

// Usage
const box = new Box(2);
const result = box.map(x => x + 3).map(x => x * 2);
console.log(result); // Box { value: 10 }

Dalam contoh ini, Box ialah functor. Kaedah peta menggunakan fungsi fn pada nilai di dalam kotak dan mengembalikan Kotak baharu dengan nilai yang diubah.

Apa itu Monad?

Monad ialah sejenis functor yang melaksanakan dua kaedah tambahan: of (atau return dalam beberapa bahasa) dan flatMap (juga dikenali sebagai bind atau chain). Monad menyediakan cara untuk merantai operasi pada nilai yang terkandung sambil mengekalkan konteks monad.

Sifat Monads
  1. Unit (daripada): Kaedah yang mengambil nilai dan mengembalikan monad yang mengandungi nilai tersebut.
  2. Bind (flatMap): Kaedah yang mengambil fungsi mengembalikan monad dan menggunakannya pada nilai yang terkandung, meratakan hasilnya.
Contoh Monad
class Box {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Box(value);
  }

  map(fn) {
    return Box.of(fn(this.value));
  }

  flatMap(fn) {
    return fn(this.value);
  }
}

// Usage
const box = Box.of(2);
const result = box
  .flatMap(x => Box.of(x + 3))
  .flatMap(x => Box.of(x * 2));
console.log(result); // Box { value: 10 }

Dalam contoh ini, Box ialah functor dan monad. Kaedah of membalut nilai dalam Kotak dan kaedah flatMap menggunakan fungsi pada nilai yang terkandung dan mengembalikan monad yang terhasil.

Kes Penggunaan Praktikal Monad dan Fungsi

Monad dan functors bukan sekadar binaan teori; mereka mempunyai aplikasi praktikal dalam pengaturcaraan dunia sebenar. Mari terokai beberapa kes penggunaan biasa.

Mengendalikan Nilai Pilihan dengan Maybe Monad

Monad Maybe digunakan untuk mengendalikan nilai pilihan, mengelakkan nilai null atau undefined dan menyediakan cara yang selamat untuk merantai operasi.

class Maybe {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Maybe(value);
  }

  isNothing() {
    return this.value === null || this.value === undefined;
  }

  map(fn) {
    return this.isNothing() ? this : Maybe.of(fn(this.value));
  }

  flatMap(fn) {
    return this.isNothing() ? this : fn(this.value);
  }
}

// Usage
const maybeValue = Maybe.of('hello')
  .map(str => str.toUpperCase())
  .flatMap(str => Maybe.of(`${str} WORLD`));
console.log(maybeValue); // Maybe { value: 'HELLO WORLD' }

Dalam contoh ini, mungkin monad mengendalikan nilai pilihan dengan selamat, membenarkan transformasi hanya jika nilainya tidak batal atau tidak ditentukan.

Mengendalikan Operasi Asynchronous dengan Promise Monad

Janji dalam JavaScript ialah monad yang mengendalikan operasi tak segerak, menyediakan cara untuk merantai operasi dan mengendalikan ralat.

const fetchData = url => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Data from ${url}`);
    }, 1000);
  });
};

// Usage
fetchData('https://api.example.com')
  .then(data => {
    console.log(data); // 'Data from https://api.example.com'
    return fetchData('https://api.example.com/2');
  })
  .then(data => {
    console.log(data); // 'Data from https://api.example.com/2'
  })
  .catch(error => {
    console.error(error);
  });

Janji membolehkan anda mengendalikan operasi tak segerak dengan cara yang bersih dan boleh digubah, merantai operasi dan mengendalikan ralat dengan anggun.

Monad dan functors ialah abstraksi yang berkuasa dalam pengaturcaraan berfungsi yang membolehkan anda bekerja dengan transformasi data, kesan sampingan dan komposisi dengan cara yang lebih berstruktur dan boleh diramal.

Walaupun asas matematik monad dan functors boleh menjadi rumit, aplikasi praktikalnya sangat berharga dalam pengaturcaraan dunia sebenar. Sama ada anda mengendalikan nilai pilihan dengan monad Maybe atau mengurus operasi tak segerak dengan Promises, teknik pengaturcaraan berfungsi ini boleh membantu anda mencipta aplikasi yang lebih mantap dan boleh dipercayai.

Atas ialah kandungan terperinci Pengenalan kepada Pengaturcaraan Fungsian dalam JavaScript: Monad dan functors #7. 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