Yuva.JS | Monadlar -> Okuyucu

Jan 27 2023
"Ortam monad" olarak da bilinen Reader monad, bir hesaplama boyunca bir ortamı veya paylaşılan bir içeriği geçirmenize izin veren işlevsel bir programlama konseptidir. Bu bağlamın belirli değerlerinden bağımsız kod yazmanıza izin vererek daha tekrar kullanılabilir ve test edilmesini kolaylaştırır.

"Ortam monad" olarak da bilinen Reader monad, bir hesaplama boyunca bir ortamı veya paylaşılan bir içeriği geçirmenize izin veren işlevsel bir programlama konseptidir. Bu bağlamın belirli değerlerinden bağımsız kod yazmanıza izin vererek daha tekrar kullanılabilir ve test edilmesini kolaylaştırır.

Reader monad genellikle JavaScript gibi işlevsel bir programlama dilinde bağımlılıkları ve yapılandırma değerlerini yönetmek için kullanılır. Reader monad, bazı dış bağlama dayanan bir hesaplamayı saf, birleştirilebilir bir şekilde tanımlamanıza olanak tanır, bu da kodunuz hakkında akıl yürütmeyi ve kodunuzu test etmeyi kolaylaştırır.

runBir Reader monad'ı tipik olarak, bağlamı bir girdi olarak alan ve hesaplamanın sonucunu döndüren, adı verilen tek bir yöntemi olan bir nesne olarak uygulanır . Reader monad, aynı bağlama bağlı birden çok hesaplamayı birbirine zincirlemek ve daha karmaşık hesaplamalar oluşturmak için kullanılabilir.

İşte JavaScript'teki Reader monadına bir örnek:

class Reader {
  constructor(fn) {
    this.run = fn
  }
  map(f) {
    return new Reader(e => f(this.run(e)))
  }
  chain(f) {
    return new Reader(e => f(this.run(e)).run(e))
  }
  // ...
}

Örneğin, bir konfigürasyon nesnesi alan ve bu konfigürasyona dayalı bir değer döndüren bir Reader oluşturabilirsiniz. Daha sonra, yapılandırma nesnesini her adımdan geçirmek zorunda kalmadan daha karmaşık bir hesaplama oluşturmak için bu Okuyuculardan birden fazlasını zincirleyebilirsiniz.

Reader 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.

ReaderMonad'ı Nest.js'de nasıl kullanabileceğinize dair bir örneği burada bulabilirsiniz :

import { Injectable } from '@nestjs/common';
import { Reader, reader } from 'fp-ts/lib/Reader';

@Injectable()
export class MyService {
  public incrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter + 1);
  }

  public decrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter - 1);
  }

  public getCounter(counter: number): Reader<number, number> {
    return reader.of(counter);
  }
}

Monad Reader, bir program veya bir dizi işlev boyunca yapılandırmanın, bağımlılıkların veya bağlamın geçişini soyutlamak için kullanılır.

Bu örnekte, incrementCounter()metot sayacı arttırır ve yeni bir değer döndürür, decrementCounter()metot sayacı azaltır ve yeni bir değer döndürür, getCounter()metot mevcut sayaç değerini döndürür.

.map(), .chain(), yöntemlerini kullanarak birden çok hesaplamayı zincirleyebilirsiniz .ap().

const program: Reader<number, number> = myService
  .incrementCounter(10)
  .chain(counter => myService.decrementCounter(counter))
  .chain(counter => myService.getCounter(counter));

console.log(program.run());

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()Reader Monad'ı çalıştırmak ve sonuçları almak için yöntemin çağrılması gerekir, ortamı argüman olarak alır.

parça listesi: