ZIO,入门,纯功能下载器
ZIO, Getting started, pure functional downloader
我有一个简单的程序,或多或少是一个下载器。它收集一个或多个可配置资源(通过自定义协议),聚合并将它们写入到位。
这个程序看起来很简单,但代码仍然很复杂,并且混合了功能代码和过程代码(来自我的 Java 背景)。我想简化它并转向功能齐全的。我正在阅读有关 ZIO 的文章,整个画面开始在我脑海中浮现。
但是,在阅读了入门和概述之后,我仍然有一些疑问。
主要流程可能是这样的:
for {
config <- Configuration.parse(args)
resources <- Downloaders.download(config)
_ <- Writer.write(resources)
} yield ()
我想包含静态值但也包含一个 http 客户端的配置将被放入 ZIO Environment
。
下载器可能是未来构建的效果器,可能会使用 ZIO bracket
关闭连接。我想我可以用 fold
汇总结果。但我不知道如何创建和执行许多下载器。
已编辑 a) 由于 Future
是纯音符,我如何建模一个将 运行 异步的效果(我打算使用 Play Standalone WS客户) ?
已编辑 b) 我应该为每个目标创建一个下载器,请求将分配给它们。但是我应该如何在我的代码中实现它?我应该创建一个 ZIO[Configuration, Throwable, List[Downloader]]
,然后通过 collectAllPar
执行所有这些吗?
我不知道如何将聚合写入磁盘。
我想用这个项目在内部推广 ZIO。所以我想使用最好的选择和最干净的方法。有人可以给我一些关于如何实现这些效果和构建我的代码的提示吗?
已编辑:我应该在 ZIO 组件上构建我的系统还是构建一组函数并将它们包装到 ZIO 效果中?
非常感谢
您的问题不是很具体,这意味着不幸的是它不会吸引高质量的答案。
我仍然会尝试回答一些要点。
Future
不纯。如果可能,请避免使用它们。
- 您的下载程序将是一个函数
Request => ZIO[R, E, Response]
。要使它们 运行 并行,请使用 ZIO.collectAllPar
或 ZIO.zip
。结果是 ZIO[R, E, List[A]]
或 ZIP[R, E, TupleX[...]]
,您可以将其存储在 resources
中以供理解。
- 可以使用 Scala 的
new PrintWriter(new File("hello.txt"))
将数据写入文件,您猜对了,ZIO.bracket
.
如需深入了解 ZIO 的程序设计,我建议阅读 De Goes 本人的 Beautiful, Simple, Testable Functional Effects for Scala。
此外,当然,请参阅 ZIO's website 上的文档。
我有一个简单的程序,或多或少是一个下载器。它收集一个或多个可配置资源(通过自定义协议),聚合并将它们写入到位。
这个程序看起来很简单,但代码仍然很复杂,并且混合了功能代码和过程代码(来自我的 Java 背景)。我想简化它并转向功能齐全的。我正在阅读有关 ZIO 的文章,整个画面开始在我脑海中浮现。
但是,在阅读了入门和概述之后,我仍然有一些疑问。
主要流程可能是这样的:
for {
config <- Configuration.parse(args)
resources <- Downloaders.download(config)
_ <- Writer.write(resources)
} yield ()
我想包含静态值但也包含一个 http 客户端的配置将被放入 ZIO
Environment
。下载器可能是未来构建的效果器,可能会使用 ZIO
bracket
关闭连接。我想我可以用fold
汇总结果。但我不知道如何创建和执行许多下载器。
已编辑 a) 由于Future
是纯音符,我如何建模一个将 运行 异步的效果(我打算使用 Play Standalone WS客户) ?
已编辑 b) 我应该为每个目标创建一个下载器,请求将分配给它们。但是我应该如何在我的代码中实现它?我应该创建一个ZIO[Configuration, Throwable, List[Downloader]]
,然后通过collectAllPar
执行所有这些吗?我不知道如何将聚合写入磁盘。
我想用这个项目在内部推广 ZIO。所以我想使用最好的选择和最干净的方法。有人可以给我一些关于如何实现这些效果和构建我的代码的提示吗? 已编辑:我应该在 ZIO 组件上构建我的系统还是构建一组函数并将它们包装到 ZIO 效果中?
非常感谢
您的问题不是很具体,这意味着不幸的是它不会吸引高质量的答案。
我仍然会尝试回答一些要点。
Future
不纯。如果可能,请避免使用它们。- 您的下载程序将是一个函数
Request => ZIO[R, E, Response]
。要使它们 运行 并行,请使用ZIO.collectAllPar
或ZIO.zip
。结果是ZIO[R, E, List[A]]
或ZIP[R, E, TupleX[...]]
,您可以将其存储在resources
中以供理解。 - 可以使用 Scala 的
new PrintWriter(new File("hello.txt"))
将数据写入文件,您猜对了,ZIO.bracket
.
如需深入了解 ZIO 的程序设计,我建议阅读 De Goes 本人的 Beautiful, Simple, Testable Functional Effects for Scala。
此外,当然,请参阅 ZIO's website 上的文档。