Хаскелл:Алгебраические типы данных, переменные типа которых должны быть экземплярами класса типов.
-
19-09-2019 - |
Вопрос
Я пытаюсь определить алгебраический тип:
data MyType t = MyType t
И сделайте это экземпляром Show:
instance Show (MyType t) where
show (MyType x) = "MyType: " ++ (show x)
GHC жалуется, потому что не может определить, что тип «t» в «Show (MyType t)» на самом деле является экземпляром Show, который необходим для (show x).
Я понятия не имею, где и как объявить «t» экземпляром Show?
Решение
Добавьте ограничение типа на тип t
:
instance Show t => Show (MyType t) where
show (MyType x) = "MyType: " ++ (show x)
Другие советы
Вы также можете просто:
data MyType t = MyType t
deriving Show
если вы хотите обычный формат шоу.
Еще одно решение — использовать GADT:
data MyType t where
MyType :: Show a => a -> MyType a
Не связан с StackOverflow