fp-ts
是一个用于 TypeScript 的函数式编程库,它提供了许多工具和类型来帮助编写函数式代码。以下是一些常见的 fp-ts
用法示例:
1. 使用 Option
处理可选值
Option
类型用于处理可能不存在的值,类似于 Maybe
类型。
import { Option, some, none, fromNullable } from 'fp-ts/Option';
import { pipe } from 'fp-ts/function';
// 创建 Option
const someValue: Option<number> = some(42);
const noValue: Option<number> = none;
// 从可能为 null 或 undefined 的值创建 Option
const nullableValue: Option<number> = fromNullable(null);
// 使用 pipe 组合操作
const result = pipe(
someValue,
option.map(value => value * 2),
option.getOrElse(() => 0)
);
console.log(result); // 输出 84
2. 使用 Either
处理错误
Either
类型用于处理可能失败的计算,类似于 Result
类型。
import { Either, left, right, tryCatch } from 'fp-ts/Either';
import { pipe } from 'fp-ts/function';
// 创建 Either
const success: Either<string, number> = right(42);
const failure: Either<string, number> = left('Error');
// 使用 tryCatch 捕获异常
const parseNumber = (input: string): Either<Error, number> =>
tryCatch(
() => JSON.parse(input),
reason => new Error(String(reason))
);
// 使用 pipe 组合操作
const result = pipe(
parseNumber('42'),
either.map(value => value * 2),
either.getOrElse(() => 0)
);
console.log(result); // 输出 84
3. 使用 Task
处理异步操作
Task
类型用于处理异步操作,类似于 Promise
。
import { Task, task } from 'fp-ts/Task';
import { pipe } from 'fp-ts/function';
// 创建 Task
const fetchData: Task<string> = () => fetch('https://api.example.com/data').then(response => response.json());
// 使用 pipe 组合操作
const result = pipe(
fetchData,
task.map(data => data.length)
);
result().then(length => console.log(length)); // 输出数据长度
4. 使用 Array
处理集合
fp-ts
提供了许多数组操作函数。
import { array } from 'fp-ts/Array';
import { pipe } from 'fp-ts/function';
// 创建数组
const numbers = [1, 2, 3, 4, 5];
// 使用 pipe 组合操作
const result = pipe(
numbers,
array.map(n => n * 2),
array.filter(n => n > 5)
);
console.log(result); // 输出 [6, 8, 10]
5. 使用 Reader
处理依赖注入
Reader
类型用于处理依赖注入。
import { Reader, reader } from 'fp-ts/Reader';
import { pipe } from 'fp-ts/function';
interface Env {
baseUrl: string;
}
// 创建 Reader
const fetchData: Reader<Env, Promise<string>> = env =>
fetch(`${env.baseUrl}/data`).then(response => response.json());
// 使用 pipe 组合操作
const result = pipe(
fetchData,
reader.map(data => data.length)
);
// 执行 Reader
result({ baseUrl: 'https://api.example.com' }).then(length => console.log(length)); // 输出数据长度
6. 使用 IO
处理副作用
IO
类型用于处理副作用。
import { IO, io } from 'fp-ts/IO';
import { pipe } from 'fp-ts/function';
// 创建 IO
const log: IO<void> = () => console.log('Hello, World!');
// 使用 pipe 组合操作
const result = pipe(
log,
io.chain(() => io.of('Done'))
);
console.log(result()); // 输出 'Hello, World!' 和 'Done'
通过这些示例,可以看到 fp-ts
提供了许多工具来帮助编写函数式代码。它们使得处理可选值、错误、异步操作、集合、依赖注入和副作用变得更加简洁和安全。