Еще более обобщенный вывод нового типа

Новые типы часто используются для изменения поведения определенных типов при использовании в определенных контекстах класса. Например, можно использоватьData.Monoid.All обертка, чтобы изменить поведениеBool когда используется какMonoid.

В настоящее время я пишу такую оболочку нового типа, которая применима к большому диапазону различных типов. Предполагается, что оболочка изменяет поведение одного конкретного экземпляра класса. Это может выглядеть так:

newtype Wrapper a = Wrapper a

instance Special a => Special (Wrapper a) where
  -- ...

Однако добавление этой оболочки часто меняет удобство использования обернутого типа. Например, если раньше я мог использовать функциюmconcat :: Monoid a => [a] -> aЯ не могу теперь использовать его для списка обернутых значений.

Я могу конечно использовать-XGeneralizedNewtypeDeriving а такжеnewtype Wrapper a = Wrapper a deriving (Monoid), Тем не менее, это только решает проблему дляMonoid и никакой другой класс, пока я буду иметь дело с открытым миром, полным разных классов, и автономное обобщенное извлечение нового типа не является действительно практическим вариантом. В идеале я бы хотел написатьderiving hiding (Special) (вывод каждого класса, кромеSpecial), но это не относится к Хаскелу, конечно.

Есть ли какой-то способ сделать это, или я просто облажался, и мне нужно добавить запрос функции GHC?

Ответы на вопрос(2)

Ваш ответ на вопрос