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

Монада 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;
  }
}

В этом примере класс Left принимает значение ошибки в своем конструкторе и имеет метод getOrElse, который позволяет получить завернутое значение ошибки. Класс Right принимает успешное значение в своем конструкторе и имеет методы map, chain и getOrElse, которые позволяют преобразовать обернутое значение и объединить несколько вычислений в цепочку.

Например, вы можете создать 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'));
    }
  }
}

В этом примере класс MyService имеет метод findUserById(id: number), возвращающий экземпляр монады Either, который является либо значением right (объект User), если он найден функцией findUserInDB(id), либо значением left (объект Error), если пользователь не найден.

Вы можете использовать метод .fold() для присоединения функции обратного вызова, которая будет вызываться со значением монады Either.

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

Вы также можете использовать функцию .map() для преобразования обернутого значения, если оно существует, и функцию .chain() для объединения нескольких вычислений в цепочку. Функция .map() будет вызываться только для значения right, а функция .chain() будет вызываться только для значения right.

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

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

Если у вас есть какие-либо вопросы или отзывы об этой статье, не стесняйтесь оставлять комментарии.
Спасибо за прочтение и присоединяйтесь к нашей команде.