Yuva.JS | Monadlar -> Ya

Jan 27 2023
Sonuç monad olarak da bilinen Her iki monad, iki olası sonuçtan birine sahip olabilecek hesaplamaları temsil etmek için kullanılan bir monaddır: Sol türünde bir değer veya Sağ türünde bir değer. Sol tip tipik olarak bir hatayı veya başarısızlığı temsil etmek için kullanılırken, Sağ tip başarılı bir hesaplamayı temsil etmek için kullanılır.

EitherMonad olarak da bilinen monad , Resultiki olası sonuçtan birine sahip olabilen hesaplamaları temsil etmek için kullanılan bir monaddır: type değeri Leftveya type değeri Right. Tür Lefttipik olarak bir hatayı veya başarısızlığı temsil etmek için kullanılırken, Righttür başarılı bir hesaplamayı temsil etmek için kullanılır.

Monad Eithertipik olarak iki alt türü olan bir nesne olarak uygulanır: Leftve Right. Alt Lefttip bir hata değeri tutarken, Rightalt tip başarılı bir değer tutar.

İşte EitherJavaScript'teki bir monad örneği:

class Left {
  constructor(value) {
    this.value = value;
  }
  map(f) {
    return this;
  }
  chain(f) {
    return this;
  }
  getOrElse(defaultValue) {
    return defaultValue;
  }
}

class Right {
  constructor(value) {
    this.value = value;
  }
  map(f) {
    return new Right(f(this.value));
  }
  chain(f) {
    return f(this.value);
  }
  getOrElse(defaultValue) {
    return this.value;
  }
}

RightÖrneğin, bir sayıyı sarmalayan bir sayı oluşturabilir ve ardından bu sayıyı artırmak için yöntemi kullanabilirsiniz veya bir hata mesajını sarmalayan mapbir oluşturup hatayı işlemek için yöntemi kullanabilirsiniz. Daha sonra , her adımda bir değerin veya bir hatanın varlığını manuel olarak kontrol etmek zorunda kalmadan, daha karmaşık bir hesaplama oluşturmak için bunlardan birden fazlasını zincirleyebilirsiniz .LeftgetOrElseRightLeft

Nest.js'de EitherMonad, hataları işlemenize ve işlevsel bir şekilde değerler döndürmenize izin veren bir Monad'dır. Başarılı (doğru değer) veya başarısız (sol değer) olabilen bir hesaplamanın sonucunu temsil etmek için kullanılabilir.

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

import { Injectable } from '@nestjs/common';
import { Either, left, right } from 'fp-ts/lib/Either';

@Injectable()
export class MyService {
  public findUserById(id: number): Either<Error, User> {
    const user = findUserInDB(id);
    if (user) {
      return right(user);
    } else {
      return left(new Error('User not found'));
    }
  }
}

.fold()Yöntemi, Monad'ın değeriyle çağrılacak bir geri arama işlevi eklemek için kullanabilirsiniz Either.

myService.findUserById(1)
        .fold(error => console.log(error), user => console.log(user))

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.

parça listesi: