0

我正在编写处理 HTTP 请求的函数集,并且需要创建一组异常来处理失败。这里是

data HStream ty => ErrorResponse ty = ErrorResponse (Response ty)
data HStream ty => HttpException ty = WrongURIException String | ConnException ConnError | RequestException (ErrorResponse ty)
instance HStream ty => Exception (HttpException ty)

其中WrongURIException对应于格式ConnException错误的 uri、TCP 堆栈中的错误和 RequestException 以处理具有非 2xx 响应代码的响应。在第 3 行声明之前instance Exception,我应该派生 Typeable 但我迷失了类型。我该怎么办?

4

1 回答 1

7

我可以建议要这样做。数据类型上下文在几乎所有可能的方面都很糟糕。它们被弃用是有原因的。如果您真的非常想要它们,请使用 GADT。

如果您不使用上下文,这很简单

 {-# LANGUAGE DeriveDataTypeable #-}
 import Data.Typeable
 import Data.Data


 data ErrorResponse ty = ErrorResponse (Response ty)
                       deriving(Data, Typeable, Show)
 data HttpResponse ty = WrongURIException String 
                      | ConnException ConnError
                      | RequestException (ErrorResponse ty)
                       deriving(Data, Typeable, Show)
 instance (Typeable ty, Show ty) => Exception (HttpException ty)

特别是从 GHC 7.8 开始,您无法为Typeableand制作自己的实例Data,因此派生是正确的方法。

于 2014-04-16T11:31:53.457 回答