Yuva.JS | Monadlar -> Devlet
State monad, durumu işlevsel, değişmez bir şekilde yönetmenize izin veren işlevsel bir programlama konseptidir. Bir hesaplamanın durumunu saf, birleştirilebilir bir şekilde güncelleyen kod yazmanıza izin verir, bu da akıl yürütmeyi ve test etmeyi kolaylaştırır.
State monad genellikle JavaScript gibi işlevsel bir programlama dilinde durum bilgisi olan hesaplamaları yönetmek için kullanılır. Durum monad'ı, bazı durumları saf, birleştirilebilir bir şekilde güncelleyen bir hesaplamayı tanımlamanıza izin verir, bu da kodunuzu düşünmeyi ve kodunuzu test etmeyi kolaylaştırır.
runBir State monad, tipik olarak, başlangıç durumunu bir girdi olarak alan ve hesaplamanın sonucunu ve güncellenmiş durumu döndüren, adı verilen tek bir yöntemi olan bir nesne olarak uygulanır . State monad, aynı durumu güncelleyen ve daha karmaşık hesaplamalar oluşturan birden çok hesaplamayı birbirine zincirlemek için kullanılabilir.
İşte JavaScript'teki Devlet monadına bir örnek:
class State {
constructor(fn) {
this.run = fn
}
map(f) {
return new State((state) => {
const [result, updatedState] = this.run(state);
return [f(result), updatedState];
});
}
chain(f) {
return new State((state) => {
const [result, updatedState] = this.run(state);
return f(result).run(updatedState);
});
}
// ...
}
Örneğin, bir ilk sayıyı alan ve bir artırılmış yeni bir sayı döndüren bir Durum oluşturabilir, daha sonra durumu manuel olarak geçmek zorunda kalmadan durumu birden çok kez güncelleyen daha karmaşık bir hesaplama oluşturmak için bu Durumlardan birden fazlasını birbirine zincirleyebilirsiniz. her adımda belirtin.
State Monad'ın JavaScript'te yaygın bir kalıp olmadığını, esas olarak Haskell, scala vb. işlevsel programlama dillerinde kullanıldığını not etmek önemlidir.
StateMonad'ı Nest.js'de nasıl kullanabileceğinize dair bir örneği burada bulabilirsiniz :
import { Injectable } from '@nestjs/common';
import { State, state } from 'fp-ts/lib/State';
interface StateType {
counter: number;
}
@Injectable()
export class MyService {
public incrementCounter(): State<StateType, number> {
return state.get().map(s => s.counter + 1).put({ counter: s.counter + 1 });
}
public decrementCounter(): State<StateType, number> {
return state.get().map(s => s.counter - 1).put({ counter: s.counter - 1 });
}
public getCounter(): State<StateType, number> {
return state.get().map(s => s.counter);
}
}
Monad State, durumu işlevsel bir şekilde yönetmek için kullanılır; bu örnek, durum olarak basit bir sayaç kullanır, ancak durum, bir nesne veya dizi gibi herhangi bir şey olabilir.
Yöntem incrementCounter()sayacı artırır ve durumu günceller, decrementCounter()yöntem sayacı azaltır ve durumu günceller, getCounter()yöntem geçerli sayaç değerini döndürür.
.map(), .chain(), yöntemlerini kullanarak birden çok hesaplamayı zincirleyebilirsiniz .ap().
const program: State<StateType, number> = myService
.incrementCounter()
.chain(() => myService.incrementCounter())
.chain(() => myService.getCounter());
console.log(program.run({ counter: 0 }).value);
Bu örneğin temel bir örnek olduğunu ve işlevsel programlamada Monad'ların tam gücünü göstermediğini not etmek önemlidir. Monad'lar, hata işleme, çoklu hesaplamaları zincirleme ve daha fazlası gibi çeşitli durumları ele almak için kullanılabilir, monad'ları uygulamadan önce sorunu ve kullanım durumlarını anlamak en iyisidir.
Ayrıca, run()State Monad'ı yürütmek ve sonuçları almak için yöntemin çağrılması gerekir, argüman olarak bir başlangıç durumu alır.
parça listesi:

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































