[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-25b2cfa0-8fac-415b-9c2f-1efaf2821452":3,"$fK-0FwbVzK5JfXBhdS3zVk7iZkrVg137d8I59KLODCjc":42},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":33},"25b2cfa0-8fac-415b-9c2f-1efaf2821452","fp-taskeither-ref","TaskEither快速参考。用于用户需要异步错误处理、API调用或可能失败的基于Promise的操作时。","cat_coding_backend","mod_coding","sickn33,coding","---\nname: fp-taskeither-ref\ndescription: Quick reference for TaskEither. Use when user needs async error handling, API calls, or Promise-based operations that can fail.\nrisk: unknown\nsource: community\nversion: 1.0.0\ntags: [fp-ts, taskeither, async, promise, error-handling, quick-reference]\n---\n\n# TaskEither Quick Reference\n\nTaskEither = async operation that can fail. Like `Promise\u003CEither\u003CE, A>>`.\n\n## When to Use\n- You need a quick fp-ts reference for async operations that can fail.\n- The task involves API calls, Promise wrapping, or composing asynchronous error-handling pipelines.\n- You want a concise cheat sheet for `TaskEither` operators and patterns.\n\n## Create\n\n```typescript\nimport * as TE from 'fp-ts\u002FTaskEither'\n\nTE.right(value)          \u002F\u002F Async success\nTE.left(error)           \u002F\u002F Async failure\nTE.tryCatch(asyncFn, toError)  \u002F\u002F Promise → TaskEither\nTE.fromEither(either)    \u002F\u002F Either → TaskEither\n```\n\n## Transform\n\n```typescript\nTE.map(fn)               \u002F\u002F Transform success value\nTE.mapLeft(fn)           \u002F\u002F Transform error\nTE.flatMap(fn)           \u002F\u002F Chain (fn returns TaskEither)\nTE.orElse(fn)            \u002F\u002F Recover from error\n```\n\n## Execute\n\n```typescript\n\u002F\u002F TaskEither is lazy - must call () to run\nconst result = await myTaskEither()  \u002F\u002F Either\u003CE, A>\n\n\u002F\u002F Or pattern match\nawait pipe(\n  myTaskEither,\n  TE.match(\n    (err) => console.error(err),\n    (val) => console.log(val)\n  )\n)()\n```\n\n## Common Patterns\n\n```typescript\nimport { pipe } from 'fp-ts\u002Ffunction'\nimport * as TE from 'fp-ts\u002FTaskEither'\n\n\u002F\u002F Wrap fetch\nconst fetchUser = (id: string) => TE.tryCatch(\n  () => fetch(`\u002Fapi\u002Fusers\u002F${id}`).then(r => r.json()),\n  (e) => ({ type: 'NETWORK_ERROR', message: String(e) })\n)\n\n\u002F\u002F Chain async calls\npipe(\n  fetchUser('123'),\n  TE.flatMap(user => fetchPosts(user.id)),\n  TE.map(posts => posts.length)\n)\n\n\u002F\u002F Parallel calls\nimport { sequenceT } from 'fp-ts\u002FApply'\nsequenceT(TE.ApplyPar)(\n  fetchUser('1'),\n  fetchPosts('1'),\n  fetchComments('1')\n)\n\n\u002F\u002F With recovery\npipe(\n  fetchUser('123'),\n  TE.orElse(() => TE.right(defaultUser)),\n  TE.getOrElse(() => defaultUser)\n)\n```\n\n## vs async\u002Fawait\n\n```typescript\n\u002F\u002F ❌ async\u002Fawait - errors hidden\nasync function getUser(id: string) {\n  try {\n    const res = await fetch(`\u002Fapi\u002Fusers\u002F${id}`)\n    return await res.json()\n  } catch (e) {\n    return null  \u002F\u002F Error info lost\n  }\n}\n\n\u002F\u002F ✅ TaskEither - errors typed and composable\nconst getUser = (id: string) => pipe(\n  TE.tryCatch(() => fetch(`\u002Fapi\u002Fusers\u002F${id}`), toNetworkError),\n  TE.flatMap(res => TE.tryCatch(() => res.json(), toParseError))\n)\n```\n\nUse TaskEither when you need **typed errors** for async operations.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,117,1596,"2026-05-16 13:18:51",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":25,"skillCount":32,"createdAt":26},"后端开发","backend","mdi-server","API、数据库、服务端架构",296,[34],{"id":35,"skillId":4,"version":36,"fileName":37,"fileSize":38,"filePath":39,"fileHash":40,"manifest":41,"createdAt":19},"19bcc4c9-77be-43bd-902b-196e47869fe0","1.0.0","fp-taskeither-ref.zip",1413,"uploads\u002Fskills\u002F25b2cfa0-8fac-415b-9c2f-1efaf2821452\u002Ffp-taskeither-ref.zip","2091ff20a5634dfaf2dfd576349e47de619f2a1e0580bb3cf89cc2cb914a8e2c","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":2957}]",{"code":43,"message":44,"data":45},200,"success",{"items":46,"stats":47,"page":50},[],{"averageRating":48,"totalRatings":48,"ratingCounts":49},0,[48,48,48,48,48],{"limit":51,"offset":48,"hasMore":52,"nextOffset":51,"ratedOnly":16},15,false]