使用上下文导出实例Typeable

时间:2014-04-16 11:23:32

标签: haskell deriving

我正在编写使用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但我在类型中丢失了。我应该怎么做?

1 个答案:

答案 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开始,您无法为TypeableData创建自己的实例,因此推导是正确的方法。