Гнездо.JS | Монады -> Список

Jan 27 2023
Монада List, также известная как монада Array, представляет собой монаду, которая используется для представления вычислений, которые могут иметь несколько возможных результатов. Это монада, обертывающая массив и позволяющая использовать монадические методы, такие как map, chain, flatMap и т. д.

Монада List, также известная как Arrayмонада, представляет собой монаду, которая используется для представления вычислений, которые могут иметь несколько возможных результатов. Это монада, которая обертывает массив и позволяет вам использовать монадические методы, такие как map, chain, flatMap, и т. д. в массиве.

Монада Listобычно реализуется как объект с единственным методом flatMap, который применяет функцию к каждому элементу массива и объединяет результаты.

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

class List {
  constructor(values) {
    this.values = values;
  }
  flatMap(f) {
    return new List(this.values.reduce((acc, x) => acc.concat(f(x)), []));
  }
}

const list = new List([1, 2, 3]);
const result = list.flatMap(x => [x * 2, x * 3]);
console.log(result.values); // [2, 3, 4, 6, 6, 9]

Например, вы можете создать Listоболочку для массива чисел, а затем использовать этот flatMapметод для применения функции к каждому элементу массива и объединения результатов. Затем вы можете связать несколько таких вычислений вместе, чтобы создать более сложное вычисление.

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

import { Injectable } from '@nestjs/common';
import { List } from 'fp-ts/lib/List';

@Injectable()
export class MyService {
  public async getUsers(): Promise<List<User>> {
    const users = await this.userRepository.find();
    return List.fromArray(users);
  }

  public async getUserById(id: string): Promise<List<User>> {
    const user = await this.userRepository.findOne(id);
    return List.of(user);
  }
}

Вы можете связать несколько вычислений, используя методы .map(), .filter(), .reduce().

myService.getUsers()
  .map(users => users.filter(user => user.age > 18))
  .map(users => users.map(user => user.name))
  .map(users => users.reduce((acc, curr) => acc + ', ' + curr))
  .fold(error => console.log(error), result => console.log(result))

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

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