我正在编写使用HTTP请求的函数集wor,需要创建一组用于处理失败的异常。这是
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
对应格式错误的uri,ConnException
对应TCP堆栈中的错误,而RequestException对应处理非2xx响应代码的响应。
在第3行声明instance Exception
之前,我应该派生出Typeable但我在类型中丢失了。我应该怎么做?
答案 0 :(得分: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开始,您无法为Typeable
和Data
创建自己的实例,因此推导是正确的方法。