Agent Skills by ALSEL
OpenAIソフトウェア開発⭐ リポ 6品質スコア 68/100

fp-taskeither-ref

TaskEitherの簡易リファレンスです。非同期エラーハンドリング、APIコール、失敗の可能性があるPromiseベースの操作が必要な場合に使用します。

description の原文を見る

Quick reference for TaskEither. Use when user needs async error handling, API calls, or Promise-based operations that can fail.

SKILL.md 本文

TaskEither クイックリファレンス

TaskEither = 失敗する可能性のある非同期操作。Promise<Either<E, A>>のようなもの。

使用場面

  • 失敗する可能性のある非同期操作に対する fp-ts クイックリファレンスが必要
  • APIコール、Promise のラッピング、または非同期エラーハンドリングパイプラインの構成が必要
  • TaskEitherのオペレータとパターンの簡潔なチートシートが欲しい

作成

import * as TE from 'fp-ts/TaskEither'

TE.right(value)          // 非同期成功
TE.left(error)           // 非同期失敗
TE.tryCatch(asyncFn, toError)  // Promise → TaskEither
TE.fromEither(either)    // Either → TaskEither

変換

TE.map(fn)               // 成功値を変換
TE.mapLeft(fn)           // エラーを変換
TE.flatMap(fn)           // チェーン (fn は TaskEither を返す)
TE.orElse(fn)            // エラーから回復

実行

// TaskEither は遅延評価 - () を呼び出して実行
const result = await myTaskEither()  // Either<E, A>

// またはパターンマッチ
await pipe(
  myTaskEither,
  TE.match(
    (err) => console.error(err),
    (val) => console.log(val)
  )
)()

よくあるパターン

import { pipe } from 'fp-ts/function'
import * as TE from 'fp-ts/TaskEither'

// fetch をラップ
const fetchUser = (id: string) => TE.tryCatch(
  () => fetch(`/api/users/${id}`).then(r => r.json()),
  (e) => ({ type: 'NETWORK_ERROR', message: String(e) })
)

// 非同期呼び出しをチェーン
pipe(
  fetchUser('123'),
  TE.flatMap(user => fetchPosts(user.id)),
  TE.map(posts => posts.length)
)

// 並列呼び出し
import { sequenceT } from 'fp-ts/Apply'
sequenceT(TE.ApplyPar)(
  fetchUser('1'),
  fetchPosts('1'),
  fetchComments('1')
)

// 回復処理付き
pipe(
  fetchUser('123'),
  TE.orElse(() => TE.right(defaultUser)),
  TE.getOrElse(() => defaultUser)
)

async/await との比較

// ❌ async/await - エラーが隠れている
async function getUser(id: string) {
  try {
    const res = await fetch(`/api/users/${id}`)
    return await res.json()
  } catch (e) {
    return null  // エラー情報が失われている
  }
}

// ✅ TaskEither - エラーは型安全で合成可能
const getUser = (id: string) => pipe(
  TE.tryCatch(() => fetch(`/api/users/${id}`), toNetworkError),
  TE.flatMap(res => TE.tryCatch(() => res.json(), toParseError))
)

非同期操作に対して型安全なエラー処理が必要な場合は TaskEither を使用します。

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
henryalouf
リポジトリ
henryalouf/ruflow
ライセンス
MIT
最終更新
2026/4/30

Source: https://github.com/henryalouf/ruflow / ライセンス: MIT

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: henryalouf · henryalouf/ruflow · ライセンス: MIT