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.
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.
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.
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.
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.
Monad dan functors bukan sekadar binaan teori; mereka mempunyai aplikasi praktikal dalam pengaturcaraan dunia sebenar. Mari terokai beberapa kes penggunaan biasa.
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.
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!