ZIO,从Effect提供环境
ZIO, Provide environment from Effect
从 ZIO 开始,我正在尝试将现有应用程序转换为纯功能应用程序。此应用程序依赖于一个 Http 和一个 Frp 客户端。它们都是从配置文件和可选的命令行参数配置的。
当前流程解析参数然后读取配置文件并合并两者。结果 Configuration
被传递给一些需要 Http 和 Ftp 客户端的组件。
现在,如果我想将其转换为 ZIO,我可以天真地创建这样的流程:
val flow = for {
options <- ZIO.succeed("Options")
configs <- ZIO.succeed(s"Config + $options")
result <- ZIO.succeed("...") // This require the "configs"
} yield ()
不幸的是,我无法提供 configs
,因为它会生成到 for comprehension 本身。
我的问题是:我们如何提供一个效果的结果作为环境?
你可以做到 .provide(configs)
,为什么不呢?
更一般地说,您可以执行 io1.flatMap(io2.provide)
到 运行 效果 io1
,然后将结果提供给另一个效果 io2
。甚至还有一个快捷方式:io1 >>> io2
.
从 ZIO 开始,我正在尝试将现有应用程序转换为纯功能应用程序。此应用程序依赖于一个 Http 和一个 Frp 客户端。它们都是从配置文件和可选的命令行参数配置的。
当前流程解析参数然后读取配置文件并合并两者。结果 Configuration
被传递给一些需要 Http 和 Ftp 客户端的组件。
现在,如果我想将其转换为 ZIO,我可以天真地创建这样的流程:
val flow = for {
options <- ZIO.succeed("Options")
configs <- ZIO.succeed(s"Config + $options")
result <- ZIO.succeed("...") // This require the "configs"
} yield ()
不幸的是,我无法提供 configs
,因为它会生成到 for comprehension 本身。
我的问题是:我们如何提供一个效果的结果作为环境?
你可以做到 .provide(configs)
,为什么不呢?
更一般地说,您可以执行 io1.flatMap(io2.provide)
到 运行 效果 io1
,然后将结果提供给另一个效果 io2
。甚至还有一个快捷方式:io1 >>> io2
.