-- | Declars data types describing the abstract syntax of a subset of Haskell
--   in the FreeTheorems library. Only declarations and type expressions are
--   covered by these data types.
--
--   Note that the data types of this module do not reflect Haskell98.
--   This is because they are able to express higher-rank functions which are
--   not part of Haskell98.
--   Also, in type expressions, a type variable must not be applied to any type
--   expression. Thus, for example, the type @m a@, as occuring in the functions
--   of the @Monad@ type class, is not expressable.
--   The reason for this restriction is that the FreeTheorems library cannot
--   handle such types.

module Language.Haskell.FreeTheorems.Syntax (

    -- * Declarations

    Declaration (..)
  , getDeclarationName
  , getDeclarationArity
  , DataDeclaration (..)
  , NewtypeDeclaration (..)
  , TypeDeclaration (..)
  , ClassDeclaration (..)
  , Signature (..)
  , DataConstructorDeclaration (..)
  , BangTypeExpression (..)
  

    -- * Type expressions

  , TypeExpression (..)
  , TypeConstructor (..)
  , TypeClass (..)
  , TypeVariable (..)
  , FixedTypeExpression (..)


    -- * Identifiers

  , Identifier (..)

) where



import Language.Haskell.FreeTheorems.BasicSyntax
import Language.Haskell.FreeTheorems.ValidSyntax
import Language.Haskell.FreeTheorems.PrettyTypes