Примеры с пакетом Haskell-src-exts

Oct 24 2020

Я работаю с Haskell и хочу создать средство проверки типов для этого языка. Для этого мне нужен способ его синтаксического анализа, и я знаю, что Haskell-src-exts хорошо подходит для этой работы. Однако я не имею ни малейшего представления о том, как работает этот пакет; Я пытался найти несколько примеров / руководств в Интернете, но безрезультатно. Может кто-нибудь мне помочь? Кто-нибудь знает какой-нибудь учебник или, может быть, может сослаться на книгу, содержащую примеры этого пакета? Я также готов попробовать другой пакет, если он хорошо описан и содержит множество примеров.

Ответы

2 K.A.Buhr Oct 23 2020 at 23:16

Удобная точка входа есть parseFile. Если для парсинга используется следующая программа:

module HelloParser where

import Language.Haskell.Exts

main = print =<< parseFile "HelloParser.hs"

затем он производит проанализированный вывод (без SrcSpanInfoзначений и переформатированный):

ParseOk
  (Module (Just (ModuleHead (ModuleName "HelloParser") Nothing Nothing)) []
    [ ImportDecl { importModule = ModuleName "Language.Haskell.Exts"
                 , importQualified = False
                 , importSrc = False
                 , importSafe = False
                 , importPkg = Nothing
                 , importAs = Nothing
                 , importSpecs = Nothing} ]
    [ PatBind
      (PVar (Ident "main"))
      (UnGuardedRhs (InfixApp
                      (Var (UnQual (Ident "print")))
                      (QVarOp (UnQual (Symbol "=<<")))
                      (App
                        (Var (UnQual (Ident "parseFile")))
                        (Lit (String "HelloParser.hs" "HelloParser.hs")))))
      Nothing ])

что кажется относительно читаемым.

Чтобы выполнить задачу проверки типов в Haskell, я не думаю, что есть какой-либо способ избежать индивидуального рассмотрения сотен типов данных и конструкторов дерева синтаксического анализа Language.Haskell.Exts.Syntaxи других модулей пакета, поэтому я не уверен, насколько дальше будет -depth tutorial поможет вам.