组合scalaz io效果对象

组合scalaz io效果对象,scala,scalaz,io-monad,Scala,Scalaz,Io Monad,我试图使用scalaz的ioeffect IO[E,A]monad作为一段非常有效的代码 我试图用IO[E,A]在高层重写的代码包含了一些关于存储在云中的文件的元数据。代码试图: 下载该文件 从文件中提取字符串 构建包含文件文本内容的pojo 将pojo提交到某个队列/restful服务 这些步骤的细节并不重要,但我想做的是按照以下思路做一些事情: def processShareActivity(fileObject: FileObject): IO[ProcessFileFailure, I

我试图使用scalaz的ioeffect IO[E,A]monad作为一段非常有效的代码

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

  • 下载该文件
  • 从文件中提取字符串
  • 构建包含文件文本内容的pojo
  • 将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] = ???
    
    def processShareActivity(fileObject:fileObject):IO[ProcessFileFailure,IndexResponse]={
    为了{
    
    文件不幸的是,您确实需要一种方法来将这些错误统一为一个常见错误:

    例如:

    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
    
    用于{
    文件