Рассмотрим следующий тип-класс:
class Listable a where
asList :: a t -> [t]
Достаточно просто создать экземпляры для типов с одним параметром:
instance Listable [] where
asList = id
instance Listable Maybe where
asList (Just x) = [x]
asList Nothing = []
Теперь, как мне создать экземпляр для пары с двумя идентичными параметрами типа? Конечно, я мог бы сделать некоторую упаковку:
data V2 a = V2 a a
v2 (p,q) = V2 p q
instance Listable V2 where
asList (V2 p q) = [p,q]
Теперь я мог бы написать такие вещи, как asList $ v2 (47, 11)
, но такого рода поражение цели.
Есть ли способ ограничить тип пары для случаев, когда оба параметра типа равны, и написать для этого экземпляр Listable
? Если нет, то каков обычный обходной путь?