Деривация экземпляра Typeable с контекстом

Я пишу набор функций для работы с 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 к ошибкам в стеке TCP и RequestException для обработки ответов с кодами ответов, отличными от 2xx. Перед объявлением instance Exception в строке 3 я должен получить Typeable, но я теряюсь в типах. Как я должен это?

1 ответ

Решение

Могу ли я предложить не делать этого? Контексты типа данных плохи практически во всех возможных случаях. Есть причина, по которой они устарели. Если вы действительно, действительно хотите их, используйте ГАДЦ.

Если вы не используете контексты, это тривиально

 {-# 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Таким образом, вывод является правильным способом.

Другие вопросы по тегам