В настоящее время я работаю над реализацией простой библиотеки комбинатора синтаксического анализатора в Идрисе, чтобы изучить язык и лучше понять системы типов в целом, но у меня возникли некоторые проблемы с пониманием того, как объявляются и используются GADT. Тип данных парсера, который я пытаюсь сформулировать, выглядит (в Haskell): type Parser a = String -> [(a,String)]
, from этот документ. По сути, тип - это функция, которая принимает строку и возвращает список.
В Идрисе у меня есть:
data Parser : Type -> Type where
fail : a -> (String -> [])
pass : a -> (String -> [(a,String)])
где экземпляр fail
- это синтаксический анализатор, который всегда дает сбой (т.е.- будет функцией, которая всегда возвращает пустой список), а экземпляр pass
- это синтаксический анализатор, который использовал какой-либо символ. При загрузке вышеуказанного в интерпретатор я получаю сообщение об ошибке несоответствия типа между List elem
и ожидаемым типом Type
. Но когда я проверяю возвращаемый тип синтаксического анализатора в ответе с помощью :t String -> List Type
, я получаю Type
, что похоже, что он должен работать.
Я был бы очень благодарен, если бы кто-нибудь мог дать хорошее объяснение, почему это объявление данных не работает, или лучшую альтернативу представлению типа данных парсера.