Не напрямую.Определение класса не может быть изменено без изменения источника и перекомпиляции.В случае классов, определенных в стандартных библиотеках, это может привести к значительному нарушению кода, поэтому это нереальный вариант.
Однако вы можете обернуть класс и добавить нужные ограничения:
class Functor f => ShowFunctor f where
smap :: (Show a, Show b) => (a -> b) -> f a -> f b
smap f = fmap f
и затем используйте этот класс вместо исходного.
Но, возможно, вам не нужен дополнительный класс, и для ваших приложений достаточно определить smap
на верхнем уровне и просто использовать еговместо fmap
,
smap :: (Functor f, Show a, Show b) => (a -> b) -> f a -> f b
smap = fmap