Хаскелл:Алгебраические типы данных, переменные типа которых должны быть экземплярами класса типов.

StackOverflow https://stackoverflow.com/questions/1319057

Вопрос

Я пытаюсь определить алгебраический тип:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top