gpt4 book ai didi

scala - 组成 scalaz io 效果对象

转载 作者:行者123 更新时间:2023-12-02 00:57:01 27 4
gpt4 key购买 nike

我正在尝试将 scalaz 的 ioeffect IO[E,A] monad 用于一段非常有效的代码。

我试图用 IO[E,A] 在高层次上重写的代码需要一些关于存储在云中的文件的元数据。代码试图:

  1. 下载文件
  2. 从文件中提取字符串
  3. 构建一个包含文件文本内容的pojo
  4. 将 pojo 提交给某个队列/restful 服务

步骤的细节并不那么重要,但我想做的是按照以下思路做一些事情:

def processShareActivity(fileObject: FileObject): IO[ProcessFileFailure, IndexResponse] = {
for {
file <- downloadFile (fileObject)
text <- extractText (file)
searchFileObject <- IO.point(buildSearchFileObject (fileObject, file, text))
indexedResponse <- indexSearchFileObject (searchFileObject)
} yield indexedResponse
}

def indexSearchFileObject(fileObject: SearchFileObject): IO[IndexFailure, IndexResponse] = ???

def buildSearchFileObject(fileObject: FileObject, file: File, str: String): SearchFileObject = ???

def extractText(file: File): IO[ExtractionFailure, String] = ???

def downloadFile(fileObject: FileObject): IO[DownloadFileFailure, File] = ???

问题是 IO[E,A]IO[F,B] 的实例似乎没有组合。也就是说,因为例如 downloadFile 的 IO 签名为其错误场景返回 DownloadFileFailureextractText 返回 ExtractionFailure,那些 monad 似乎无法构成 for 理解。

有没有一种简单的方法可以让我的顶级 for 理解码合成 IO[ProcessFileFailure, IndexResponse] 其中 ProcessFileFailure 是否有某种围绕子方法中可能发生的不同类型故障的包装故障对象?

最佳答案

不幸的是,您确实需要一种方法将这些错误统一为一个常见错误:

例如:

sealed trait ProcessFileFailure
object ProcessFileFailure {
case class Index(e: IndexFailure) extends ProcessFileFailure
case class Extraction(e: ExtractionFailure) extends ProcessFileFailure
case class Download(e: DownloadFileFailure) extends ProcessFileFailure
}

你的理解将变成:

for {
file <- downloadFile (fileObject).leftMap(ProcessFileFailure.Download)
text <- extractText (file).leftMap(ProcessFileFailure.Extraction)
searchFileObject <- IO.point(buildSearchFileObject (fileObject, file, text))
indexedResponse <- indexSearchFileObject (searchFileObject).leftMap(ProcessFileFailure.Index)
} yield indexedResponse

这很尴尬,但它确实具有能够存储出错的所有内容以及出错发生的确切上下文的优势。

关于scala - 组成 scalaz io 效果对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53603430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com