我正在尝试使用Scalaz的IO效应单子IO[E,A],处理一段非常具有效果的代码。我希望用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] = ???
问题在于
IO[E,A]
和IO[F,B]
的实例似乎无法组合。例如,downloadFile
方法的IO签名返回DownloadFileFailure
作为其错误场景,而extractText
返回ExtractionFailure
,这些单子似乎无法在for
循环中组合。是否有一种简单的方法使我的顶级
for
循环组合起来,以便它会产生一个IO[ProcessFileFailure, IndexResponse]
,其中ProcessFileFailure
是一种围绕子方法中可能发生的不同类型故障的包装故障对象?