fp-pragmatic – Coding skill for AI agents
A practical, jargon-free guide to functional programming - the 80/20 approach that gets results without the academic overhead
Install the fp-pragmatic skill with one command
Pick the tool you use, copy the command and paste it in your terminal. The skill lands in that tool's skills folder and is ready in your next session.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/fp-pragmatic-10e63.tgz | tar xz -C ~/.claude/skills
Call it in Claude Code: /fp-pragmatic – then describe the task you want done.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/fp-pragmatic-10e63.tgz | tar xz -C ~/.codex/skills
Call it in Codex: $fp-pragmatic – then describe the task you want done.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/fp-pragmatic-10e63.tgz | tar xz -C ~/.hermes/skills
Call it in Hermes Agent: /fp-pragmatic – then describe the task you want done.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/fp-pragmatic-10e63.tgz | tar xz -C ~/.deepcode/skills
Call it in DeepSeek: /fp-pragmatic – then describe the task you want done.
SKILL.md content
Pragmatic Functional Programming
Read this first. This guide cuts through the academic jargon and shows you what actually matters. No category theory. No abstract nonsense. Just patterns that make your code better.
Detailed Guide
Read [the detailed guide](references/detailed-guide.md) before executing this skill. It retains the complete procedure and reference material. Treat its safety, prerequisites, and validation requirements as mandatory. For focused work, load the relevant sections; for end-to-end work, read the guide completely.
When to Use
- You want a pragmatic starting point for fp-ts or functional programming in TypeScript.
- The task is exploratory or educational and needs an 80/20 view of what is actually worth adopting.
- You need guidance on when FP helps and when it is better to keep code simple.
When NOT to Use FP
Functional programming is not always the answer. Here's when to keep it simple.
Simple Null Checks
// 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')
)Simple Loops
// 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
)Performance-Critical Code
// Benchmark hot paths on the actual runtime; no universal speed claim
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
const sum = pipe(numbers, A.reduce(0, (acc, n) => acc + n))When Your Team Doesn't Know FP
If you're the only one who can read the code, it's not good code.
// 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))
)---
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
Related skills
- fp-react – Practical patterns for using fp-ts with React - hooks, state, forms, data fetching…
- fp-refactor – Comprehensive guide for refactoring imperative TypeScript code to fp-ts functional…
- fp-taskeither-ref – Quick reference for TaskEither. Use when user needs async error handling, API calls, or…
- fp-ts-errors – Handle errors as values using fp-ts Either and TaskEither for cleaner, more predictable…
- fp-ts-pragmatic – A practical, jargon-free guide to fp-ts functional programming - the 80/20 approach that…
- fp-ts-react – Practical patterns for using fp-ts with React - hooks, state, forms, data fetching. Use…
- framework-migration-code-migrate – You are a code migration expert specializing in transitioning codebases between…
- framework-migration-deps-upgrade – You are a dependency management expert specializing in safe, incremental upgrades of…