Yuva.JS | Monadlar -> IO

Jan 27 2023
"Giriş/Çıkış monad" olarak da bilinen IO monad, bir giriş/çıkış işleminin açıklamasını yürütülmesinden ayırmanıza izin veren işlevsel bir programlama konseptidir. Başka bir deyişle, bazı G/Ç eylemlerini (bir dosyadan okuma veya bir veritabanıyla etkileşim gibi) gerçekleştiren bir hesaplamayı, açıkça çağrılana kadar bu eylemi fiilen gerçekleştirmeden tanımlamanıza izin verir.

"Giriş/Çıkış monad" olarak da bilinen IO monad, bir giriş/çıkış işleminin açıklamasını yürütülmesinden ayırmanıza izin veren işlevsel bir programlama konseptidir. Başka bir deyişle, bazı G/Ç eylemlerini (bir dosyadan okuma veya bir veritabanıyla etkileşim gibi) gerçekleştiren bir hesaplamayı, açıkça çağrılana kadar bu eylemi fiilen gerçekleştirmeden tanımlamanıza izin verir.

IO monad genellikle JavaScript gibi işlevsel bir programlama dilinde yan etkileri yönetmek için kullanılır. IO monad, etkili bir hesaplamayı saf, birleştirilebilir bir şekilde tanımlamanıza olanak tanır, bu da kodunuz hakkında akıl yürütmeyi ve kodunuzu test etmeyi kolaylaştırır.

runBir G/Ç monad'ı tipik olarak , G/Ç eylemini gerçekleştiren ve sonucu döndüren, adı verilen tek bir yöntemi olan bir nesne olarak uygulanır . G/Ç monad'ı, birden çok G/Ç işlemini birbirine zincirlemek ve daha karmaşık hesaplamalar oluşturmak için kullanılabilir.

İşte JavaScript'teki IO monadına bir örnek:

class IO {
  constructor(effect) {
    this.effect = effect
  }
  run() {
    return this.effect()
  }
  map(f) {
    return new IO(() => f(this.run()))
  }
  chain(f) {
    return new IO(() => f(this.run()).run())
  }
  // ...
}

import { Injectable } from '@nestjs/common';
import { IO, io } from 'fp-ts/lib/IO';

@Injectable()
export class MyService {
  public async getUsers(): IO<User[]> {
    return io.fromPromise(this.userRepository.find());
  }

  public async getUserById(id: string): IO<User> {
    return io.fromPromise(this.userRepository.findOne(id));
  }
}

.map(), .chain(), yöntemlerini kullanarak birden çok hesaplamayı zincirleyebilirsiniz .ap().

const program: IO<string> = myService.getUsers()
    .map(users => users.filter(user => user.age > 18))
    .chain(users => myService.getUserById(users[0].id))
    .map(user => user.name)

  program.run()

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.

Ayrıca, run()IO Monad'ı yürütmek ve sonuçları almak için yöntem çağrılmalıdır, bu, impureharici duruma/bağlama bağlı olarak bilinir, IO Monad'ları, daha iyi kod organizasyonu için saf olmayan kodu saf koddan ayırmak için kullanılır. ve test.

parça listesi: