fp-ts-pragmatic について
TypeScript開発者向けの実践的なfp-tsガイドです。null許容値、エラー、非同期処理の関数型パターンを扱い、より単純な方法が適切な場面も説明します。
主な機能
- 01null許容値の実践パターン
- 02エラー処理の整理
- 03非同期処理への対応
- 04命令型コードの関数型リファクタリング
- 05FPを避ける場面の判断
活用シーン
- 01fp-tsを始める際の実践的な指針
- 02TypeScriptのエラー処理の整理
- 03非同期ロジックのリファクタリング
- 04関数型の抽象化が必要か判断
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill fp-ts-pragmaticインストール後、Claude Code で/fp-ts-pragmaticを入力して読み込まれたか確認します。
同梱ファイルreferences/detailed-guide.md
詳細
実践的関数型プログラミング
まずこれを読んでください。 このガイドはアカデミックな専門用語を排し、実際に重要なことだけを示します。圏論はありません。抽象的なナンセンスもありません。あなたのコードをより良くするパターンだけです。
詳細ガイド
このスキルを実行する前に詳細ガイドをお読みください。完全な手順と参照資料が保持されています。その安全性、前提条件、検証要件は必須事項として扱ってください。集中的な作業では関連するセクションを読み込み、エンドツーエンドの作業ではガイドを完全に読んでください。
このスキルを使うべき場面
- fp-ts を始めていて、実践的な指針が必要なとき
- null 許容値、エラー、非同期処理を扱う TypeScript コードを書くとき
- アカデミックな負担なしに、よりクリーンで保守しやすい関数型コードを書きたいとき
- 命令型コードを関数型スタイルにリファクタリングするとき
FP を使うべきでない場面
関数型が常に答えとは限りません。シンプルに保つべき場面を以下に示します。
単純な null チェック
// Just use optional chaining - it's built into the language
const city = user?.address?.city ?? 'Unknown'
// DON'T overcomplicate it
const city = pipe(
O.fromNullable(user),
O.flatMap(u => O.fromNullable(u.address)),
O.flatMap(a => O.fromNullable(a.city)),
O.getOrElse(() => 'Unknown')
)
単純なループ
// A for loop is fine when you need early exit or complex logic
function findFirst(items: Item[], predicate: (i: Item) => boolean): Item | null {
for (const item of items) {
if (predicate(item)) return item
}
return null
}
// DON'T force FP when it doesn't help
const result = pipe(
items,
A.findFirst(predicate),
O.toNullable
)
パフォーマンスが重要なコード
// For hot paths, benchmark both implementations on the actual runtime
function sumLarge(numbers: number[]): number {
let sum = 0
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i]
}
return sum
}
// A.reduce does not create an intermediate array per item; callbacks still have runtime costs
const sum = pipe(numbers, A.reduce(0, (acc, n) => acc + n))
チームが FP を知らない場合
コードを読めるのが自分だけなら、それは良いコードではありません。
// If your team knows this pattern
async function getUser(id: string): Promise<User | null> {
try {
const response = await fetch(`/api/users/${encodeURIComponent(id)}`)
if (!response.ok) return null
return await response.json()
} catch {
return null
}
}
// Don't force this on them
const getUser = (id: string): TE.TaskEither<Error, User> =>
pipe(
TE.tryCatch(() => fetch(`/api/users/${encodeURIComponent(id)}`), E.toError),
TE.flatMap(r => r.ok ? TE.right(r) : TE.left(new Error('Not found'))),
TE.flatMap(r => TE.tryCatch(() => r.json(), E.toError))
)
制限事項
- このスキルは、タスクが上記の範囲に明確に一致する場合にのみ使用してください。
- 出力を環境固有の検証、テスト、専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全境界、成功基準が欠けている場合は、作業を中止して確認を求めてください。
コメント
Markdown 対応