Я хотел бы определить экземпляр монады с контейнером M как монадой и с содержащимся типом a
, который должен быть членом класса Показать
. Это ограничение (то, что a
является членом Show
) должно обеспечиваться системой типов.
Я попробовал вот так, но M
, к сожалению, не того типа:
data M = forall a. Show a => M a
instance Monad M where
return x = M x
Все другие попытки достичь этого наталкиваются на следующую проблему: Так как Монада
] является классом конструктора, у меня нет явного доступа к типу a
содержащихся в нем элементов, поэтому я не могу его ограничить.
Кто-нибудь знает решение этой проблемы без определения нового класса Monad
?