hermit-0.1.4.0: Haskell Equational Reasoning Model-to-Implementation Tunnel

Safe HaskellNone

Language.HERMIT.Core

Contents

Synopsis

Generic Data Type

NOTE: Type is not included in the generic datatype. However, we could have included it and provided the facility for descending into types. We have not done so because (a) we do not need that functionality, and (b) the types are complicated and we're not sure that we understand them.

data Core Source

Core is the sum type of all nodes in the AST that we wish to be able to traverse. All Node instances in HERMIT define their Generic type to be Core.

Constructors

ModGutsCore ModGuts

The module.

ProgCore CoreProg

A program (a telescope of top-level binding groups).

BindCore CoreBind

A binding group.

DefCore CoreDef

A recursive definition.

ExprCore CoreExpr

An expression.

AltCore CoreAlt

A case alternative.

data CoreProg Source

A program is a telescope of nested binding groups. That is, each binding scopes over the remainder of the program. In GHC Core, programs are encoded as [CoreBind]. This data type is isomorphic.

Constructors

ProgNil

An empty program.

ProgCons CoreBind CoreProg

A binding group and the program it scopes over.

data CoreDef Source

A (potentially recursive) definition is an identifier and an expression. In GHC Core, recursive definitions are encoded as (Id, CoreExpr) pairs. This data type is isomorphic.

Constructors

Def Id CoreExpr 

type CoreTickish = Tickish IdSource

Unlike everything else, there is no synonym for Tickish Id provided by GHC, so we define one.

Conversions to/from Core

defsToRecBind :: [CoreDef] -> CoreBindSource

Convert a list of recursive definitions into an (isomorphic) recursive binding group.

defToIdExpr :: CoreDef -> (Id, CoreExpr)Source

Convert a definition to an identifier/expression pair.

progToBinds :: CoreProg -> [CoreBind]Source

Get the list of bindings in a program.

bindsToProg :: [CoreBind] -> CoreProgSource

Build a program from a list of bindings. Note that bindings earlier in the list are considered scope over bindings later in the list.

bindToIdExprs :: CoreBind -> [(Id, CoreExpr)]Source

Extract the list of identifier/expression pairs from a binding group.

Utilities

isType :: CoreExpr -> BoolSource

Succeeds if the expression is either a Type or type Var.

typeExprToType :: CoreExpr -> Maybe TypeSource

Convert a CoreExpr expression that is a Type into a Type.

exprTypeOrKind :: CoreExpr -> TypeSource

GHC's exprType function throws an error if applied to a Type (but, inconsistently, return a Kind if applied to a type variable). This function returns the Kind of a Type, but otherwise behaves as exprType.

appCount :: CoreExpr -> IntSource

Count the number of nested applications.