У меня есть следующий код, который собирает в моей программе:Записи GADT запись с стесненным типом
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
class (Show (Data a)) => HasData (a :: *) where
type Data a :: *
data Foo :: * -> * where
Foo :: (HasData a) => String -> Data a -> Int -> Foo a -- bunch of args
deriving instance Show (Foo a)
Поскольку число аргументов для Foo
застройщика может быть много, я хотел бы написать код, используя синтаксис записи , но я не могу понять, как сделать это с помощью синтаксиса GADT (GHC осуждается типов данных контексты, поэтому я стараюсь избегать их):
data Foo :: * -> * where
Foo {
getStr :: String,
getData :: Data a, -- want (HasData a)
getInt :: Int
} :: Foo a -- want (HasData a)
Мне нужно ограничить a
в конструкторе Foo
«s так же, как я сделал або без синтаксиса записи. Как я могу это сделать?
Что такое 'Data a' for? Вы добавляете фантомный тип для какой-то цели, потому что у вас нет ничего типа 'a', просто материал типа' Data a'. (Например, если вы просто заменяете контекст 'Show' на свой конструктор, что немного упрощает ваши требования.) –
У меня возникла проблема, связанная с этой проблемой. Я немного нуб, и я не мог понять, как заставить «GADTs» работать. Я добавил 2 заголовка для 'KindSignatures' и' GADTs', и теперь он работает. Соответствующая ошибка, так что этот комментарий является googleable, был: 'Незаконная подпись типа 'Free' (Используйте KindSignatures для разрешения подписи)', и теперь я знаю, что это означает, что заголовок должен состоять из '{- # ... # - } ' –