hindley-milner-type-check-0.1.1.0: Type inference for Hindley-Milner based languages
Safe HaskellNone
LanguageHaskell2010

Type.Check.HM.Term

Description

This module contains the abstract syntax tree of the term language.

Synopsis

Documentation

newtype Term prim loc v Source #

The type of terms.

Constructors

Term 

Fields

Instances

Instances details
TypeFunctor (Term prim) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

mapType :: (Type loc var -> Type loc var) -> Term prim loc var -> Term prim loc var Source #

LocFunctor (Term prim) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

mapLoc :: (locA -> locB) -> Term prim locA var -> Term prim locB var Source #

CanApply (Term prim) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

apply :: Ord v => Subst loc v -> Term prim loc v -> Term prim loc v Source #

Functor (Term prim loc) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

fmap :: (a -> b) -> Term prim loc a -> Term prim loc b #

(<$) :: a -> Term prim loc b -> Term prim loc a #

(PrettyVar v, Pretty prim) => Pretty (FixityCtx v (Term prim loc v)) Source # 
Instance details

Defined in Type.Check.HM.Pretty

Methods

pretty :: FixityCtx v (Term prim loc v) -> Doc ann #

prettyList :: [FixityCtx v (Term prim loc v)] -> Doc ann #

(Eq prim, Eq loc, Eq v) => Eq (Term prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

(==) :: Term prim loc v -> Term prim loc v -> Bool #

(/=) :: Term prim loc v -> Term prim loc v -> Bool #

(Data prim, Data loc, Data v) => Data (Term prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Term prim loc v -> c (Term prim loc v) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Term prim loc v) #

toConstr :: Term prim loc v -> Constr #

dataTypeOf :: Term prim loc v -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Term prim loc v)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Term prim loc v)) #

gmapT :: (forall b. Data b => b -> b) -> Term prim loc v -> Term prim loc v #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Term prim loc v -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Term prim loc v -> r #

gmapQ :: (forall d. Data d => d -> u) -> Term prim loc v -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Term prim loc v -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Term prim loc v -> m (Term prim loc v) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Term prim loc v -> m (Term prim loc v) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Term prim loc v -> m (Term prim loc v) #

(Show prim, Show loc, Show v) => Show (Term prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

showsPrec :: Int -> Term prim loc v -> ShowS #

show :: Term prim loc v -> String #

showList :: [Term prim loc v] -> ShowS #

(PrettyVar v, Pretty prim) => Pretty (Term prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Pretty

Methods

pretty :: Term prim loc v -> Doc ann #

prettyList :: [Term prim loc v] -> Doc ann #

HasLoc (Term prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Associated Types

type Loc (Term prim loc v) Source #

Methods

getLoc :: Term prim loc v -> Loc (Term prim loc v) Source #

type Loc (Term prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

type Loc (Term prim loc v) = loc

data TermF prim loc v r Source #

Term functor. The arguments are loc for source code locations, v for variables, r for recurion.

Constructors

Var loc v

Variables.

Prim loc prim

Primitives.

App loc r r

Applications.

Lam loc v r

Abstractions.

Let loc (Bind loc v r) r

Let bindings.

LetRec loc [Bind loc v r] r

Recursive let bindings

AssertType loc r (Type loc v)

Assert type.

Case loc r [CaseAlt loc v r]

case alternatives

Constr loc v

constructor with tag

Bottom loc

value of any type that means failed program.

Instances

Instances details
Functor (TermF prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

fmap :: (a -> b) -> TermF prim loc v a -> TermF prim loc v b #

(<$) :: a -> TermF prim loc v b -> TermF prim loc v a #

Foldable (TermF prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

fold :: Monoid m => TermF prim loc v m -> m #

foldMap :: Monoid m => (a -> m) -> TermF prim loc v a -> m #

foldMap' :: Monoid m => (a -> m) -> TermF prim loc v a -> m #

foldr :: (a -> b -> b) -> b -> TermF prim loc v a -> b #

foldr' :: (a -> b -> b) -> b -> TermF prim loc v a -> b #

foldl :: (b -> a -> b) -> b -> TermF prim loc v a -> b #

foldl' :: (b -> a -> b) -> b -> TermF prim loc v a -> b #

foldr1 :: (a -> a -> a) -> TermF prim loc v a -> a #

foldl1 :: (a -> a -> a) -> TermF prim loc v a -> a #

toList :: TermF prim loc v a -> [a] #

null :: TermF prim loc v a -> Bool #

length :: TermF prim loc v a -> Int #

elem :: Eq a => a -> TermF prim loc v a -> Bool #

maximum :: Ord a => TermF prim loc v a -> a #

minimum :: Ord a => TermF prim loc v a -> a #

sum :: Num a => TermF prim loc v a -> a #

product :: Num a => TermF prim loc v a -> a #

Traversable (TermF prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

traverse :: Applicative f => (a -> f b) -> TermF prim loc v a -> f (TermF prim loc v b) #

sequenceA :: Applicative f => TermF prim loc v (f a) -> f (TermF prim loc v a) #

mapM :: Monad m => (a -> m b) -> TermF prim loc v a -> m (TermF prim loc v b) #

sequence :: Monad m => TermF prim loc v (m a) -> m (TermF prim loc v a) #

(Eq prim, Eq loc, Eq v) => Eq1 (TermF prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftEq :: (a -> b -> Bool) -> TermF prim loc v a -> TermF prim loc v b -> Bool #

(Ord prim, Ord loc, Ord v) => Ord1 (TermF prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftCompare :: (a -> b -> Ordering) -> TermF prim loc v a -> TermF prim loc v b -> Ordering #

(Show prim, Show loc, Show v) => Show1 (TermF prim loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> TermF prim loc v a -> ShowS #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [TermF prim loc v a] -> ShowS #

(Eq loc, Eq v, Eq prim, Eq r) => Eq (TermF prim loc v r) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

(==) :: TermF prim loc v r -> TermF prim loc v r -> Bool #

(/=) :: TermF prim loc v r -> TermF prim loc v r -> Bool #

(Data prim, Data loc, Data v, Data r) => Data (TermF prim loc v r) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> TermF prim loc v r -> c (TermF prim loc v r) #

gunfold :: (forall b r0. Data b => c (b -> r0) -> c r0) -> (forall r1. r1 -> c r1) -> Constr -> c (TermF prim loc v r) #

toConstr :: TermF prim loc v r -> Constr #

dataTypeOf :: TermF prim loc v r -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (TermF prim loc v r)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (TermF prim loc v r)) #

gmapT :: (forall b. Data b => b -> b) -> TermF prim loc v r -> TermF prim loc v r #

gmapQl :: (r0 -> r' -> r0) -> r0 -> (forall d. Data d => d -> r') -> TermF prim loc v r -> r0 #

gmapQr :: forall r0 r'. (r' -> r0 -> r0) -> r0 -> (forall d. Data d => d -> r') -> TermF prim loc v r -> r0 #

gmapQ :: (forall d. Data d => d -> u) -> TermF prim loc v r -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> TermF prim loc v r -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> TermF prim loc v r -> m (TermF prim loc v r) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> TermF prim loc v r -> m (TermF prim loc v r) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> TermF prim loc v r -> m (TermF prim loc v r) #

(Show loc, Show v, Show prim, Show r) => Show (TermF prim loc v r) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

showsPrec :: Int -> TermF prim loc v r -> ShowS #

show :: TermF prim loc v r -> String #

showList :: [TermF prim loc v r] -> ShowS #

data CaseAlt loc v a Source #

Case alternatives

Constructors

CaseAlt 

Fields

Instances

Instances details
Functor (CaseAlt loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

fmap :: (a -> b) -> CaseAlt loc v a -> CaseAlt loc v b #

(<$) :: a -> CaseAlt loc v b -> CaseAlt loc v a #

Foldable (CaseAlt loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

fold :: Monoid m => CaseAlt loc v m -> m #

foldMap :: Monoid m => (a -> m) -> CaseAlt loc v a -> m #

foldMap' :: Monoid m => (a -> m) -> CaseAlt loc v a -> m #

foldr :: (a -> b -> b) -> b -> CaseAlt loc v a -> b #

foldr' :: (a -> b -> b) -> b -> CaseAlt loc v a -> b #

foldl :: (b -> a -> b) -> b -> CaseAlt loc v a -> b #

foldl' :: (b -> a -> b) -> b -> CaseAlt loc v a -> b #

foldr1 :: (a -> a -> a) -> CaseAlt loc v a -> a #

foldl1 :: (a -> a -> a) -> CaseAlt loc v a -> a #

toList :: CaseAlt loc v a -> [a] #

null :: CaseAlt loc v a -> Bool #

length :: CaseAlt loc v a -> Int #

elem :: Eq a => a -> CaseAlt loc v a -> Bool #

maximum :: Ord a => CaseAlt loc v a -> a #

minimum :: Ord a => CaseAlt loc v a -> a #

sum :: Num a => CaseAlt loc v a -> a #

product :: Num a => CaseAlt loc v a -> a #

Traversable (CaseAlt loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

traverse :: Applicative f => (a -> f b) -> CaseAlt loc v a -> f (CaseAlt loc v b) #

sequenceA :: Applicative f => CaseAlt loc v (f a) -> f (CaseAlt loc v a) #

mapM :: Monad m => (a -> m b) -> CaseAlt loc v a -> m (CaseAlt loc v b) #

sequence :: Monad m => CaseAlt loc v (m a) -> m (CaseAlt loc v a) #

(Eq loc, Eq v) => Eq1 (CaseAlt loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftEq :: (a -> b -> Bool) -> CaseAlt loc v a -> CaseAlt loc v b -> Bool #

(Ord loc, Ord v) => Ord1 (CaseAlt loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftCompare :: (a -> b -> Ordering) -> CaseAlt loc v a -> CaseAlt loc v b -> Ordering #

(Show loc, Show v) => Show1 (CaseAlt loc v) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> CaseAlt loc v a -> ShowS #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [CaseAlt loc v a] -> ShowS #

(Eq loc, Eq v, Eq a) => Eq (CaseAlt loc v a) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

(==) :: CaseAlt loc v a -> CaseAlt loc v a -> Bool #

(/=) :: CaseAlt loc v a -> CaseAlt loc v a -> Bool #

(Data loc, Data v, Data a) => Data (CaseAlt loc v a) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> CaseAlt loc v a -> c (CaseAlt loc v a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (CaseAlt loc v a) #

toConstr :: CaseAlt loc v a -> Constr #

dataTypeOf :: CaseAlt loc v a -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (CaseAlt loc v a)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (CaseAlt loc v a)) #

gmapT :: (forall b. Data b => b -> b) -> CaseAlt loc v a -> CaseAlt loc v a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> CaseAlt loc v a -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> CaseAlt loc v a -> r #

gmapQ :: (forall d. Data d => d -> u) -> CaseAlt loc v a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> CaseAlt loc v a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> CaseAlt loc v a -> m (CaseAlt loc v a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> CaseAlt loc v a -> m (CaseAlt loc v a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> CaseAlt loc v a -> m (CaseAlt loc v a) #

(Show loc, Show v, Show a) => Show (CaseAlt loc v a) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

showsPrec :: Int -> CaseAlt loc v a -> ShowS #

show :: CaseAlt loc v a -> String #

showList :: [CaseAlt loc v a] -> ShowS #

data Bind loc var a Source #

Local variable definition.

let lhs = rhs in ...

Constructors

Bind 

Fields

Instances

Instances details
Functor (Bind loc var) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

fmap :: (a -> b) -> Bind loc var a -> Bind loc var b #

(<$) :: a -> Bind loc var b -> Bind loc var a #

Foldable (Bind loc var) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

fold :: Monoid m => Bind loc var m -> m #

foldMap :: Monoid m => (a -> m) -> Bind loc var a -> m #

foldMap' :: Monoid m => (a -> m) -> Bind loc var a -> m #

foldr :: (a -> b -> b) -> b -> Bind loc var a -> b #

foldr' :: (a -> b -> b) -> b -> Bind loc var a -> b #

foldl :: (b -> a -> b) -> b -> Bind loc var a -> b #

foldl' :: (b -> a -> b) -> b -> Bind loc var a -> b #

foldr1 :: (a -> a -> a) -> Bind loc var a -> a #

foldl1 :: (a -> a -> a) -> Bind loc var a -> a #

toList :: Bind loc var a -> [a] #

null :: Bind loc var a -> Bool #

length :: Bind loc var a -> Int #

elem :: Eq a => a -> Bind loc var a -> Bool #

maximum :: Ord a => Bind loc var a -> a #

minimum :: Ord a => Bind loc var a -> a #

sum :: Num a => Bind loc var a -> a #

product :: Num a => Bind loc var a -> a #

Traversable (Bind loc var) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

traverse :: Applicative f => (a -> f b) -> Bind loc var a -> f (Bind loc var b) #

sequenceA :: Applicative f => Bind loc var (f a) -> f (Bind loc var a) #

mapM :: Monad m => (a -> m b) -> Bind loc var a -> m (Bind loc var b) #

sequence :: Monad m => Bind loc var (m a) -> m (Bind loc var a) #

(Eq loc, Eq var) => Eq1 (Bind loc var) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftEq :: (a -> b -> Bool) -> Bind loc var a -> Bind loc var b -> Bool #

(Ord loc, Ord var) => Ord1 (Bind loc var) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftCompare :: (a -> b -> Ordering) -> Bind loc var a -> Bind loc var b -> Ordering #

(Show loc, Show var) => Show1 (Bind loc var) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Bind loc var a -> ShowS #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [Bind loc var a] -> ShowS #

(Eq loc, Eq var, Eq a) => Eq (Bind loc var a) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

(==) :: Bind loc var a -> Bind loc var a -> Bool #

(/=) :: Bind loc var a -> Bind loc var a -> Bool #

(Data loc, Data var, Data a) => Data (Bind loc var a) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Bind loc var a -> c (Bind loc var a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Bind loc var a) #

toConstr :: Bind loc var a -> Constr #

dataTypeOf :: Bind loc var a -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Bind loc var a)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Bind loc var a)) #

gmapT :: (forall b. Data b => b -> b) -> Bind loc var a -> Bind loc var a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Bind loc var a -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Bind loc var a -> r #

gmapQ :: (forall d. Data d => d -> u) -> Bind loc var a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Bind loc var a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Bind loc var a -> m (Bind loc var a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Bind loc var a -> m (Bind loc var a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Bind loc var a -> m (Bind loc var a) #

(Show loc, Show var, Show a) => Show (Bind loc var a) Source # 
Instance details

Defined in Type.Check.HM.Term

Methods

showsPrec :: Int -> Bind loc var a -> ShowS #

show :: Bind loc var a -> String #

showList :: [Bind loc var a] -> ShowS #

varE :: loc -> var -> Term prim loc var Source #

varE loc x constructs a variable whose name is x with source code at loc.

primE :: loc -> prim -> Term prim loc var Source #

primE loc prim constructs a primitive with source code at loc.

appE :: loc -> Term prim loc v -> Term prim loc v -> Term prim loc v Source #

appE loc a b constructs an application of a to b with source code at loc.

lamE :: loc -> v -> Term prim loc v -> Term prim loc v Source #

lamE loc x e constructs an abstraction of x over e with source code at loc.

letE :: loc -> Bind loc v (Term prim loc v) -> Term prim loc v -> Term prim loc v Source #

letE loc binds e constructs a binding of binds in e with source code at loc. No recursive bindings.

letRecE :: loc -> [Bind loc v (Term prim loc v)] -> Term prim loc v -> Term prim loc v Source #

letRecE loc binds e constructs a recursive binding of binds in e with source code at loc.

assertTypeE :: loc -> Term prim loc v -> Type loc v -> Term prim loc v Source #

assertTypeE loc term ty constructs assertion of the type ty to term.

caseE :: loc -> Term prim loc v -> [CaseAlt loc v (Term prim loc v)] -> Term prim loc v Source #

caseE loc expr alts constructs case alternatives expression.

constrE :: loc -> v -> Term prim loc v Source #

constrE loc ty tag arity constructs constructor tag expression.

bottomE :: loc -> Term prim loc v Source #

bottomE loc constructs bottom value.

freeVars :: Ord v => Term prim loc v -> Set v Source #

Get free variables of the term.

sortDeps :: Ord v => [(v, Term prim loc v)] -> [(v, Term prim loc v)] Source #