Гнездо.JS | Монады -> Либо

Jan 27 2023
Монада Someone, также известная как монада Result, представляет собой монаду, которая используется для представления вычислений, которые могут иметь один из двух возможных результатов: значение типа Left или значение типа Right. Тип Left обычно используется для представления ошибки или сбоя, а тип Right используется для представления успешного вычисления.

Монада Either, также известная как Resultмонада, представляет собой монаду, которая используется для представления вычислений, которые могут иметь один из двух возможных результатов: значение типа Leftили значение типа Right. Тип Leftобычно используется для представления ошибки или сбоя, а Rightтип используется для представления успешного вычисления.

Монада Eitherобычно реализуется как объект, имеющий два подтипа: Leftи Right. Подтип Leftсодержит значение ошибки, а Rightподтип содержит успешное значение.

Вот пример монады Eitherв JavaScript:

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который упаковывает число, а затем использовать mapметод для увеличения этого числа, или вы можете создать , Leftкоторый упаковывает сообщение об ошибке, а затем использовать getOrElseметод для обработки ошибки. Затем вы можете связать несколько из них Rightвместе Left, чтобы создать более сложное вычисление, без необходимости вручную проверять наличие значения или ошибки на каждом шаге.

В Nest.js Eitherмонада — это монада, которая позволяет вам обрабатывать ошибки и возвращать значения функциональным способом. Его можно использовать для представления результата вычисления, которое может быть либо успешным (правое значение), либо неудачным (левое значение).

Вот пример того, как вы можете использовать Eitherмонаду в Nest.js:

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()метод для присоединения функции обратного вызова, которая будет вызываться со значением монады Either.

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

Важно отметить, что этот пример является базовым и не демонстрирует всю мощь монад в функциональном программировании. Монады можно использовать для обработки различных случаев, таких как обработка ошибок, объединение нескольких вычислений в цепочку и многое другое. Прежде чем применять монады, лучше понять проблему и варианты использования.

Список частей: