fp-ts函数式编程 - either, left & right
前两篇的快速链接
pipe与flow
option, map, flatten 与 chain
Either (fp-ts/lib/Either) 用来表示一个同步操作,该操作可能成功也可能失败。TaskEither是Either的异步版本,后面的随笔再作介绍。
Right、Left是Either的衍生类(子类),分别表示成功(Right),失败(Left)的情况。其定义可以近似认为如下:
type Either<E, A> = Left<E> | Right<A>
export interface Left<E> {
readonly _tag: 'Left'
readonly left: E
}
export interface Right<A> {
readonly _tag: 'Right'
readonly right: A
}
Either在函数式编程中的主要作用是捕获异常状态,由于不能在pipe(管道)处理序列中加入try/catch,所以只能用Either来处理异常并中断管道方法的执行。
下面的代码示例有两个validate方法,验证姓名、密码。如果都通过,则执行最后的SayHello,否则后续方法不会被执行。
import { pipe } from "fp-ts/lib/function";
import { Either, left, right, chain, map} from "fp-ts/lib/Either";
type ErrorType =
"invalid name"
| "invalid password"
| "others";
type UserInfo = {
name: string,
password: string,
age?: number
}
function ValidateName(user: UserInfo): Either<ErrorType, UserInfo> {
return user.name.length > 3? right(user) : left("invalid name")
}
function ValidatePassword(user: UserInfo): Either<ErrorType, UserInfo> {
return user.password.length > 3? right(user) : left("invalid password")
}
function SayHello(user: UserInfo) {
console.log(`hello ${user.name}`);
}
pipe(
{ name:'Andy', password:'123456'},
ValidateName,
chain(ValidatePassword),
map(SayHello)
);
pipe(
{ name:'Andy', password:'12'},
ValidateName,
chain(ValidatePassword),
map(SayHello)
);
使用ts-node命令执行后,会看到只有一行hello Andy的输出。证明了第二个pipe,由于validate返回left,则中断了后续代码的执行。
参考
https://dev.to/ryanleecode/practical-guide-to-fp-ts-p3-task-either-taskeither-2hpl
http://www.troikatech.com/blog/2020/09/24/fp-ts-error-handling-the-functional-way/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具