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

WBOY
Lepaskan: 2024-07-18 09:41:19
asal
725 orang telah melayarinya

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

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

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

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

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!

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