Каков наилучший способ проверить, что декларация не соответствует правильному типу? С помощью GADT нет ничего тривиального в том, что приложение-конструктор является правильным или нет. Если вы пишете библиотеку типа безопасных конструкций, естественно, что нельзя создать незаконную конструкцию. Итак, как часть тестового набора, я хочу, чтобы некоторые примеры незаконных конструкций были отклонены с помощью проверки типа.Haskell: Как проверить, что код не компилируется?
В качестве примера см. Векторное представление с размером объекта. Это намного проще, чем типичные проблемы, которые я хочу решить, но это хороший пример для проверки метода тестирования.
data Vector n t where
EmptyVec :: Vector 0 t
ConsVec :: t -> Vector n t -> Vector (n+1) t
// TODO: test that it does not typecheck
illegalVec = ConsVec 'c' (ConsVec "b" EmptyVec)
Возможно, вам захочется сделать «мета-тест». Напишите небольшой скрипт, который пытается скомпилировать ваш код и уверяет, что компилятор не выходит с кодом 0. – Kris
Я думаю, что вы пытаетесь реализовать здесь какие-то зависимые типы? ... Какие языковые расширения вы хотите использовать здесь? Чтобы первая часть работала вообще. – Carsten
@ CarstenKönig: 'TypeOperators',' GADTs', 'DataKinds' и импорт' GHC.TypeLits'. –