Вы обещаете компилятору, что значение, которое вы поместите в ShowBox
, будет иметь тип forall a. Show a => a
.Есть только одно возможное значение с этим типом, и оно _|_
.Я думаю, что вы, вероятно, хотите экзистенциальный тип, который выглядит довольно похожим, но означает что-то совсем другое.
{-# LANGUAGE ExistentialQuantification #-}
data ShowBox = forall a. Show a => ShowBox a
Это должно быть сделано с data
, а не newtype
.Сопоставление с образцом в конструкторе - это то, что в этом случае приводит экземпляр Show в область видимости.Поскольку newtype
s не имеют представления во время выполнения, им негде хранить полиморфное свидетельство, которое подразумевает экзистенциальное количественное определение.