Вдохновением для этого является создание списка значений, которые являются экземплярами Show
. Я нашел следующий фрагмент, который использует GADT для создания конкретного типа Showable
.Построение конкретных типов для моделей с GADT
data Showable where Showable :: Show a => a -> Showable
instance Show Showable where
show (Showable x) = show x
list :: [Showable]
list = [Showable 4, Showable "hello", Showable 'a']
Затем я попытался сделать Showable
более общим путем создания типа, которые могли бы сделать какой-либо конкретный класс типов.
data Concrete a where Concrete :: a b => b -> Concrete a
instance Show (Concrete Show) where
show (Concrete x) = show x
list :: [Concrete Show]
list = [Concrete 4, Concrete "hello", Concrete 'a']
Это работает с ConstraintKinds и расширениями FlexibleInstances языка, но для того, чтобы использовать Concrete
сделать конкретные типы для других классов типов, каждый из которых требует нового экземпляра.
Есть ли способ создать что-то похожее на Concrete
так, что, например, Concrete Show
является автоматически экземпляром Show
?
Поскольку 'Concrete' является * конструктором типа * и' Show' является * типом класса *, выражение 'Concrete Show' не является даже законным, а тем более экземпляром чего-либо. Возможно, я ошибаюсь, но я собираюсь предположить, что вы никогда не добьетесь этого. – MathematicalOrchid
@MathematicsOrchid Это уже работало с ConstraintKinds и FlexibleInstances. Я добавил это к вопросу. – afuous
@MathematicsOrchid Теперь вы можете, так как система сортировки позволяет 'Show :: * -> Constraint', и вы можете параметризовать тип с таким типом, как это было сделано выше. – chi