1

假设我需要调用远程 JSON/HTTP 服务。我发出一个 JSON 请求,通过 HTTP 将其发送到服务器,然后接收并解析 JSON 响应。

假设我有MyError错误的数据类型并且我的所有函数都返回Either[MyError, R]

type Result[A] = Either[MyError, A]    

def makeJsonRequest(requestData: RequestData): Result[String] = ...

def invoke(url: URL, jsonRequest: String): Result[String] = ...

def parseJsonResponse(jsonResponse: String): Result[ResponseData] = ...

我可以将它们结合起来编写一个新函数:

def invokeService(url: URL, requestData: RequestData) Result[ResponseData] = for {
   jsonRequest <- makeJsonRequest(requestData).right
   jsonResponse <- invoke(url, req).right 
   responseData <- parseJsonResponse(jsonResponse).right
} yield responseData

现在如果parseJsonResponse失败了怎么办?

我得到了错误,但我还需要整个上下文。那就是我需要url,requestDatajsonRequest。你会建议我怎么做?

4

1 回答 1

2

如果这是一个特定情况,我会将MyError其变成一个特征(ADT),并允许其中一个可能的值是JsonParsingFailed(jsonRequest, ...).

如果它是更通用的东西,我可能会使用Writer(或者更确切地说type MyWriter[A] = Writer[Vector[MyLogEntry], A],然后使用EitherT[MyWriter, MyError, A])在每个阶段“记录事件”。

于 2014-10-30T17:32:49.747 回答