Еще более обобщенный вывод нового типа
Новые типы часто используются для изменения поведения определенных типов при использовании в определенных контекстах класса. Например, можно использовать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?