Gniazdo.JS | Monady -> Lista

Jan 27 2023
Monada listy, znana również jako monada tablicowa, jest monadą używaną do reprezentowania obliczeń, które mogą mieć wiele możliwych wyników. Jest to monada, która opakowuje tablicę i pozwala na użycie metod monadycznych, takich jak map, chain, flatMap itp.

Monada List, znana również jako Arraymonada, jest monadą używaną do reprezentowania obliczeń, które mogą mieć wiele możliwych wyników. Jest to monada, która zawija tablicę i pozwala na użycie metod monadycznych, takich jak map, chain, flatMap, itp. na tablicy.

Monada Listjest zwykle implementowana jako obiekt, który ma jedną metodę flatMap, która stosuje funkcję do każdego elementu tablicy i łączy wyniki.

Oto przykład monady Listw 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]

Można na przykład utworzyć obiekt List, który zawija tablicę liczb, a następnie zastosować tę flatMapmetodę do każdego elementu tablicy i połączyć wyniki. Następnie można połączyć wiele tych obliczeń, aby utworzyć bardziej złożone obliczenia.

Oto przykład, jak możesz użyć ListMonady w 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);
  }
}

Możesz połączyć wiele obliczeń za pomocą metod .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))

Należy zauważyć, że ten przykład jest prosty i nie pokazuje pełnej mocy monad w programowaniu funkcjonalnym. Monad można używać do obsługi różnych przypadków, takich jak obsługa błędów, łączenie wielu obliczeń i nie tylko. Najlepiej zrozumieć problem i przypadki użycia przed zastosowaniem monad.

Lista części: