Поскольку людям, похоже, нравится мой комментарий, вот он как ответ:
Если вы хотите переопределить классы типов для существующих типов, вы можете заключить их в newtype
-объявленный тип.Это позволяет вам определять свои собственные реализации без каких-либо фактических накладных расходов во время выполнения (поскольку newtype
изоморфно исходному типу, во время выполнения фактический бокс не выполняется).
Это может выглядеть примерно так:
newtype MyChar = MyChar Char
instance Show MyChar where
show (MyChar c) = "head \"" ++ c : "\""
Вы можете использовать это, обернув Char
s MyChar
, например:
print $ fmap MyChar "test"
Это распечатает
[head "t",head "e",head "s",head "t"]