Я начал читать о GADT в Haskell Wiki, но не очень хорошо понимал это. Вы рекомендуете конкретную книгу или статью в блоге, объясняющую GADT для новичков Haskell?
Материал для обучения GADT
Ответ 1
Apfelmus сделал видеоурок для GADT, который может быть полезен.
Ответ 2
Мне нравится пример в руководстве GHC. Это просто, и это иллюстрирует некоторые ключевые моменты:
-
GADT позволяют использовать систему типов Haskell для моделирования системы типов языка, который вы реализуете ( "язык объектов" )
-
Это позволяет статической проверке Haskell утверждать, что ваш "компилятор проходит" или что-то не сохраняет тип. Функции, принимающие объектно-язычные термины, могут предполагать, что эти термины хорошо типизированы. Функции, возвращающие термины на языке объектов, необходимы для создания четко типизированных терминов.
-
Соответствие шаблону конструктору GADT вызывает уточнение типа.
eval
имеет типTerm a -> a
в целом, но правая часть дляeval (Lit i)
имеет типInt
, потому что левый конструктор имел типTerm Int
. -
Система Haskell не заботится о том, какие типы вы дадите своим конструкторам GADT. Мы могли бы так же легко сделать каждый конструктор в
data Term a
дать результат типаTerm a
, илиTerm Bool
, и определениеdata
все равно пройдет. Но мы не сможем написатьeval :: Term a -> a
. Вы выбираете типы тегов GADT для моделирования своей проблемы, так что полезные функции, которые вы хотите записать, хорошо типизированы.
Ответ 3
Другие ссылки:
Ответ 4
Haskell wiki GADTs для чайников - лучшее объяснение, которое я видел.
Проблема я (и, как я подозреваю, другие) с большинством представлений заключается в том, что они показывают примеры GADT в терминах синтаксиса, что неочевидно до тех пор, пока вы не поймете GADT. Это делает простейшие примеры, на которые все построено особенно сложно, чтобы полностью понять - вы можете догадаться о том, что делают многие из шаблонов, но понимание точной роли каждого утверждения является сложным.
Сообщение "для чайников" анализирует и создает смысл синтаксиса на пути к объяснению его собственных основных примеров, что делает его гораздо более полезной отправной точкой. Я очень рекомендую его.