≪ Today I learned. RSS購読
公開日
タグ
Programming
著者
ダーシノ(@bc_rikko)

Algebraic Effects(代数的エフェクト) とは?

2019年時点でAlgebraic Effectsをサポートした言語はごく一部で広く使えるものではない。

Algebraic Effectsの例

  1. 例外発生時、try/catchではできなかった「catch後に再開」ができる
  2. 奥深くにあるメソッドがPromiseを返すと呼び出し元のすべてのメソッドにasync/awaitがつくが、Algebraic Effectsではそうならない
  3. WhatとHowを明確に分けられる

PerformとHandleを行き来することで詳細な処理を分解する

function createFile(content) {
  // 2. どこに何を出力するかは知らない
  perform Log('filename: ' + content.name)

  // 4. OpenFileが非同期であっても resume が実行されるまで待つだけ
  const file = perform OpenFile(content.name)

  // 6. Writeが非同期であっても以下略
  perform Write({ file, content })

  // 8. どこに何を出力するかは知らない
  perform Log('Done:')
}

function main() {
  try {
    // 1.
    createFile(content)
  } handle(effect) {
    if (effect === Log) {
      // 3., 9.
      ログの出力()
      resume // perform を実行したところに戻る
    }
    if (effect === OpenFile) {
      // 5.
      const file = await ファイルを開く()
      resume with file
    }
    if (effect === Write) {
      // 7.
      await ファイルの書き込み()
      resume
    }
  }
}