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

    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
        }
      }
    }