假设我需要调用远程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
,requestData
和jsonRequest
。你会怎么建议我这样做?
答案 0 :(得分:2)
如果这是特定情况,我会将MyError
变为特征(ADT),并允许其中一个可能的值为JsonParsingFailed(jsonRequest, ...)
。
如果它更通用,我可以使用Writer
(或更确切地说type MyWriter[A] = Writer[Vector[MyLogEntry], A]
然后使用EitherT[MyWriter, MyError, A]
)在每个阶段“记录事件”。