
Eff开箱即用效果大全14种Effect逐一拆解你该用哪一个【免费下载链接】effEff monad for cats - https://atnos-org.github.io/eff项目地址: https://gitcode.com/gh_mirrors/eff/effEff 是一个基于 Scala 与 cats 的可扩展效果Extensible Effects库为函数式编程提供替代 Monad Transformer 的方案。它开箱即用地内置了14 种 EffectReader、Writer、Eval、State、Option、Either、Validate、Error、List、Choose、Memo、Future、Task、Safe。本文逐一拆解每种效果的用途与适用场景帮你快速回答一个问题我该用哪一个为什么选择 Eff一分钟了解背景传统函数式编程中组合多种效果需要层层嵌套的 Monad Transformer类型签名会迅速膨胀成变换器塔。Eff 基于 free-er monad 与可扩展效果的设计让你用一个统一的Eff[R, A]类型来描述效果栈按需在栈顶添加或移除效果。在 sbt 中只需一行即可引入Scala 3libraryDependencies org.atnos %% eff % 8.0.0所有 14 种效果的完整清单见官方文档源码 doc/src/test/scala/org/atnos/site/OutOfTheBox.scala。14 种 Effect 快速选型总表效果一句话定位典型运行方法适用场景EvalEffect⏱️延迟计算runEvalIO 式副作用、延迟执行OptionEffect❓可能无值runOption查表、可空输入EitherEffect⚠️失败并停止runEither带错误信息的校验ValidateEffect✅累积多个失败runNel表单/参数批量校验ErrorEffect️延迟失败捕获runError捕获异常并转为失败ReaderEffect⚙️读取环境/配置runReader依赖注入、配置读取WriterEffect附带日志输出runWriter日志、审计轨迹StateEffect读写状态runState计数器、会话状态ListEffect产生多个值runList枚举组合、多解搜索ChooseEffect非确定性选择runChoose分支剪枝、随机决策MemoEffect缓存昂贵计算runMemo重复计算加速FutureEffect异步计算runSequential基于Future的异步TaskEffectMonix Task 异步runAsyncMonix 生态集成SafeEffect资源安全释放runSafe连接、文件等资源管理基础四件套计算与控制流EvalEffect延迟执行充当整体 IO最简单的一个效果把计算推迟到运行时才执行可以视为某种通用的 IO 效果。提供runEval直接执行和attemptEval额外捕获Throwable。源码位于 eval/src/main/scala/org/atnos/eff/EvalEffect.scala。选它当你需要延迟副作用执行或想要一个轻量级 IO 替代品。OptionEffect值可能不存在直接短路用some(a)传递值用none让后续所有计算停止。非常适合从Map.get等可空结果中取值。源码位于 option/src/main/scala/org/atnos/eff/OptionEffect.scala。选它当逻辑是没有这个值就算了不关心为什么没有。EitherEffect失败时告诉你原因类似 Option但失败时携带错误信息。还可以通过catchLeft拦截错误并尝试恢复。源码位于 either/src/main/scala/org/atnos/eff/EitherEffect.scala。选它当失败需要为什么且只关心第一个错误。ValidateEffect把所有错误一次性收齐与 Either 的关键区别是累积失败而不是短路。做表单校验时用户希望一次看到邮箱格式错误 密码太短而不是修一个报错一个——这就是它的主场。源码位于 validate/src/main/scala/org/atnos/eff/ValidateEffect.scala。选它当批量校验、报告收集需要展示全部错误。ErrorEffectEval 与 Either 的混合体既可创建延迟计算ok也能以失败fail或异常exception结束并提供andFinally、orElse、whenFailed等组合子。运行结果为Throwable Either Failure Either A。源码位于 error/src/main/scala/org/atnos/eff/ErrorEffect.scala。选它当计算可能抛异常也可能返回自定义失败类型你想统一处理。环境四件套配置、日志与状态ReaderEffect从环境读配置核心方法是ask用于获取当前环境配置对象。运行时通过runReader传入配置值还可以把小 Reader翻译注入大 Reader例如从Conf中取port注入Reader[Int, A]。源码位于 reader/src/main/scala/org/atnos/eff/ReaderEffect.scala。选它当依赖注入、读取应用配置、测试时替换环境。WriterEffect一路计算一路记日志用tell向结果附加一条消息最终返回(值, 日志)。还能自定义Fold把日志写入文件。源码位于 writer/src/main/scala/org/atnos/eff/WriterEffect.scala。选它当审计日志、调试轨迹、不改变主结果值的副产物。StateEffect可变的 State纯函数地写可看作 Reader 与 Writer 的组合get读状态、put写状态。一个亮点是用tag在同一栈中同时追踪多个不同状态如Int与String两个计数器互不干扰。运行方式有evalState只要值、runState值状态、exec只要状态。源码位于 state/src/main/scala/org/atnos/eff/StateEffect.scala。选它当计数器、会话上下文、多路状态流转。ListEffect一次计算返回多个值用values展开全部可能值singleton/empty控制保留与否天然适合找出所有满足条件的组合这类问题。源码位于 list/src/main/scala/org/atnos/eff/ListEffect.scala。选它当组合枚举、笛卡尔积、求所有解。进阶三件套非确定性与性能ChooseEffect比 List 更聪明的分支选择Choose是List的泛化不再探索所有分支而是允许剪枝。运行时的行为由你提供的Alternative[F]实例决定——用List跑就是收集全部结果用其他实例可以实现找到第一个就停等策略。源码位于 choose/src/main/scala/org/atnos/eff/ChooseEffect.scala还附带Rand随机数支持。选它当搜索与剪枝、非确定性决策、需要控制分支策略的场景。MemoEffect昂贵计算只算一次按 key 缓存计算结果相同 key 再次出现直接返回缓存值运行时需提供一个Cache实现。库自带两种线程安全实现ConcurrentHashMapCache无上限注意内存ConcurrentWeakIdentityHashMapCache弱引用可被 GC 回收也可自行实现Cache接口接入 Caffeine 等更强大的缓存。源码位于 future/src/main/scala/org/atnos/eff/MemoEffect.scala。选它当递归计算、重复查库查缓存、性能敏感的纯函数。SafeEffect资源保证释放异常也不怕核心是bracket(open)(step)(close)打开资源→使用→无论成败都关闭另有finally与catchThrowable。运行结果(Throwable Either A, List[Throwable])同时告诉你程序结果和清理动作是否也出了错。源码位于 safe/src/main/scala/org/atnos/eff/SafeEffect.scala。选它当数据库连接、文件句柄、锁等必须释放的资源。异步双雄FutureEffect 与 TaskEffectFutureEffectTimedFuture基于 Scala Future本质是 ScalaFuture的薄封装额外内置超时能力传入ScheduledExecutionContext。注意Future代表已启动的计算因此传入 Eff 的应是返回 Future 的函数。还可用futureMemo系列操作符对异步计算做缓存。源码位于 future/src/main/scala/org/atnos/eff/FutureEffect.scala。选它当项目已用scala.concurrent.Future想要超时保护与组合能力。TaskEffect基于 Monix TaskFutureEffect的 Monix 版本需要额外引入eff-monix扩展模块运行时传入 Monix 的Scheduler即可。源码位于 monix/src/main/scala/org/atnos/eff/addon/monix/TaskEffect.scala。选它当项目构建在 Monix 生态上需要其取消、调度等高级特性。你该用哪一个场景速查读配置/依赖注入→Reader记日志、审计→Writer状态流转计数器等→State查表可能查不到→Option失败要报错→Either要收集全部错误→Validate延迟副作用 / 轻量 IO→Eval要捕获异常→Error枚举所有解→List要剪枝搜索→Choose重复计算太贵→Memo异步处理→Future或Task管理必须关闭的资源→Safe最强大的地方在于自由组合Fx.fx2[R1, R2]一行声明即可把任意多个效果叠进同一个栈如ReaderStateOption同时使用各效果的运行方法可以按栈的顺序依次调用。延伸模块生态扩展除了核心的 14 种效果仓库还提供扩展模块为第三方生态添加效果scalazScalaz 的 Task、Validated 等monix即上文TaskEffectdoobie数据库连接 IO 效果doobie/src/main/scala/org/atnos/eff/addon/doobie/DoobieConnectionIOEffect.scala结语从 14 选 1 到按需叠加Eff 的哲学是每种效果只管一件事按需叠加进效果栈。先问自己程序需要哪几类能力读配置要日志会失败管资源对照上表勾选再用Fx.fx1/Fx.fx2声明栈类型即可起步。完整用法可参考仓库内 doc/src/test/scala/org/atnos/site/ 下的Introduction.scala、Tutorial.scala与Cookbook.scala文档源码从零搭建你自己的第一个效果。【免费下载链接】effEff monad for cats - https://atnos-org.github.io/eff项目地址: https://gitcode.com/gh_mirrors/eff/eff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考