-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A lambda calculus interpreter -- -- A simple implementation of the Untyped Lambda Calculus @package lambda-calculator @version 3.0.0.1 module Language.Lambda.Shared.Errors data LambdaException -- | An expression that cannot be parsed Examples: -- -- x y = y ParseError :: Text -> LambdaException -- | A let binding nested in another expression InvalidLet :: Text -> LambdaException -- | The expected type does not match the actual type Examples: -- -- (x: X. x) (y:Y) TyMismatchError :: Text -> LambdaException -- | A catch-all error that indicates a bug in this project ImpossibleError :: LambdaException -- | Returns true if the passed in value is a LamdbaExpression. Can be -- used, for example, as a shouldThrow matcher isLambdaException :: LambdaException -> Bool isLetError :: LambdaException -> Bool isParseError :: LambdaException -> Bool isImpossibleError :: LambdaException -> Bool instance GHC.Classes.Eq Language.Lambda.Shared.Errors.LambdaException instance GHC.Exception.Type.Exception Language.Lambda.Shared.Errors.LambdaException instance RIO.Prelude.Display.Display Language.Lambda.Shared.Errors.LambdaException instance GHC.Show.Show Language.Lambda.Shared.Errors.LambdaException module Language.Lambda.Shared.UniqueSupply defaultUniques :: [Text] module Language.Lambda.SystemF.Expression data SystemFExpr name ty -- | Variable: x Var :: name -> SystemFExpr name ty -- | Function application: `x y` App :: SystemFExpr name ty -> SystemFExpr name ty -> SystemFExpr name ty -- | Lambda abstraction: `x: X. x` Abs :: name -> Ty ty -> SystemFExpr name ty -> SystemFExpr name ty -- | Type Abstraction: `X. body` TyAbs :: ty -> SystemFExpr name ty -> SystemFExpr name ty -- | Type Application: `x [X]` TyApp :: SystemFExpr name ty -> Ty ty -> SystemFExpr name ty data Ty name -- | Type variable (T) TyVar :: name -> Ty name -- | Type arrow (T -> U) TyArrow :: Ty name -> Ty name -> Ty name -- | Universal type (forall T. X) TyForAll :: name -> Ty name -> Ty name prettyPrint :: Pretty pretty => pretty -> Text upperLambda :: Char instance GHC.Show.Show name => GHC.Show.Show (Language.Lambda.SystemF.Expression.Ty name) instance GHC.Classes.Eq name => GHC.Classes.Eq (Language.Lambda.SystemF.Expression.Ty name) instance (GHC.Show.Show name, GHC.Show.Show ty) => GHC.Show.Show (Language.Lambda.SystemF.Expression.SystemFExpr name ty) instance (GHC.Classes.Eq name, GHC.Classes.Eq ty) => GHC.Classes.Eq (Language.Lambda.SystemF.Expression.SystemFExpr name ty) instance (Prettyprinter.Internal.Pretty name, Prettyprinter.Internal.Pretty ty) => Prettyprinter.Internal.Pretty (Language.Lambda.SystemF.Expression.SystemFExpr name ty) instance Prettyprinter.Internal.Pretty name => Prettyprinter.Internal.Pretty (Language.Lambda.SystemF.Expression.Ty name) module Language.Lambda.SystemF.Parser parseExpr :: Text -> Either ParseError (SystemFExpr Text Text) parseType :: Text -> Either ParseError (Ty Text) module Language.Lambda.SystemF.State data TypecheckState name TypecheckState :: Context name -> [name] -> TypecheckState name [tsContext] :: TypecheckState name -> Context name [tsUniques] :: TypecheckState name -> [name] type Typecheck name = StateT (TypecheckState name) (Except LambdaException) type Context name = Map name (Ty name) runTypecheck :: Typecheck name result -> TypecheckState name -> Either LambdaException (result, TypecheckState name) execTypecheck :: Typecheck name result -> TypecheckState name -> Either LambdaException result unsafeRunTypecheck :: Typecheck name result -> TypecheckState name -> (result, TypecheckState name) unsafeExecTypecheck :: Typecheck name result -> TypecheckState name -> result mkTypecheckState :: [name] -> TypecheckState name context :: Lens' (TypecheckState name) (Context name) uniques :: Lens' (TypecheckState name) [name] getContext :: Typecheck name (Context name) getUniques :: Typecheck name [name] modifyContext :: (Context name -> Context name) -> Typecheck name () modifyUniques :: ([name] -> [name]) -> Typecheck name () setContext :: Context name -> Typecheck name () setUniques :: [name] -> Typecheck name () module Language.Lambda.SystemF type Globals = Map String (SystemFExpr String String) evalText :: Text -> Typecheck Text (SystemFExpr Text Text) module Language.Lambda.SystemF.TypeCheck type UniqueSupply n = [n] type Context' n t = Map n t typecheck :: (Ord name, Pretty name) => SystemFExpr name name -> Typecheck name (Ty name) typecheckVar :: Ord name => name -> Typecheck name (Ty name) typecheckAbs :: (Ord name, Pretty name) => name -> Ty name -> SystemFExpr name name -> Typecheck name (Ty name) typecheckApp :: (Ord name, Pretty name) => SystemFExpr name name -> SystemFExpr name name -> Typecheck name (Ty name) typecheckTyAbs :: (Ord name, Pretty name) => name -> SystemFExpr name name -> Typecheck name (Ty name) typecheckTyApp :: (Ord name, Pretty name) => SystemFExpr name name -> Ty name -> Typecheck name (Ty name) unique :: Typecheck name name substitute :: Eq n => Ty n -> n -> SystemFExpr n n -> SystemFExpr n n substituteTy :: Eq name => Ty name -> name -> Ty name -> Ty name tyMismatchError :: (Pretty t1, Pretty t2) => t1 -> t2 -> LambdaException module Language.Lambda.Untyped.Expression data LambdaExpr name -- | Variables Var :: name -> LambdaExpr name -- | Application App :: LambdaExpr name -> LambdaExpr name -> LambdaExpr name -- | Abstractions Abs :: name -> LambdaExpr name -> LambdaExpr name -- | Let bindings Let :: name -> LambdaExpr name -> LambdaExpr name lambda :: Char prettyPrint :: Pretty name => LambdaExpr name -> Text instance GHC.Show.Show name => GHC.Show.Show (Language.Lambda.Untyped.Expression.LambdaExpr name) instance GHC.Classes.Eq name => GHC.Classes.Eq (Language.Lambda.Untyped.Expression.LambdaExpr name) instance Prettyprinter.Internal.Pretty name => Prettyprinter.Internal.Pretty (Language.Lambda.Untyped.Expression.LambdaExpr name) module Language.Lambda.Untyped.Parser parseExpr :: Text -> Either ParseError (LambdaExpr Text) module Language.Lambda.Untyped.State -- | The evaluation state data EvalState name EvalState :: Globals name -> [name] -> EvalState name [esGlobals] :: EvalState name -> Globals name -- | Unused unique names [esUniques] :: EvalState name -> [name] -- | A stateful computation type Eval name = StateT (EvalState name) (Except LambdaException) -- | A mapping of global variables to expressions type Globals name = Map name (LambdaExpr name) -- | Run an evalualation runEval :: Eval name result -> EvalState name -> Either LambdaException (result, EvalState name) -- | Run an evalualation, throwing away the final state execEval :: Eval name result -> EvalState name -> Either LambdaException result -- | Run an evaluation, throwing away the final state. If the result is an -- error, throws it unsafeExecEval :: Eval name result -> EvalState name -> result -- | Run an evaluation. If the result is an error, throws it unsafeRunEval :: Eval name result -> EvalState name -> (result, EvalState name) globals :: Lens' (EvalState name) (Globals name) uniques :: Lens' (EvalState name) [name] -- | Create an EvalState mkEvalState :: [name] -> EvalState name -- | Access globals from the state monad getGlobals :: Eval name (Globals name) -- | Access unique supply from state monad getUniques :: Eval name [name] setGlobals :: Globals name -> Eval name () setUniques :: [name] -> Eval name () module Language.Lambda.Untyped.Eval -- | The evaluation state data EvalState name EvalState :: Globals name -> [name] -> EvalState name [esGlobals] :: EvalState name -> Globals name -- | Unused unique names [esUniques] :: EvalState name -> [name] -- | Evaluate an expression evalExpr :: (Pretty name, Ord name) => LambdaExpr name -> Eval name (LambdaExpr name) -- | Look up free vars that have global bindings and substitute them subGlobals :: Ord name => Map name (LambdaExpr name) -> LambdaExpr name -> LambdaExpr name -- | Function application betaReduce :: (Eq name, Pretty name) => LambdaExpr name -> LambdaExpr name -> Eval name (LambdaExpr name) -- | Rename abstraction parameters to avoid name captures alphaConvert :: Eq name => [name] -> LambdaExpr name -> Eval name (LambdaExpr name) -- | Eliminite superfluous abstractions etaConvert :: Eq n => LambdaExpr n -> LambdaExpr n -- | Find the free variables in an expression freeVarsOf :: Eq n => LambdaExpr n -> [n] module Language.Lambda.Untyped evalText :: Text -> Eval Text (LambdaExpr Text) runEvalText :: Text -> Globals Text -> Either LambdaException (LambdaExpr Text, EvalState Text) execEvalText :: Text -> Globals Text -> Either LambdaException (LambdaExpr Text) unsafeExecEvalText :: Text -> Globals Text -> LambdaExpr Text defaultUniques :: [Text]