content: -- | Common Fortran evaluation definitions.
  
  module Language.Fortran.Repr.Eval.Common where
  
  import qualified Language.Fortran.AST as F
  
  {- | Monads which provide functionality to evaluate Fortran expressions in some
       static context.
  
  Actions in this monad may
  
    * request the value of a variable (may return 'Nothing' if not in scope)
    * record some user-facing information concerning evaluation
  
  As usage examples, a simple pure evaluator may use a plain map of 'F.Name' to
  @'EvalTo' m@. A more complex type evaluator may allow "defaulting" for variables
  not in scope via IMPLICIT rules.
  
  The associated type family 'EvalTo' enables using this for both type and value
  evaluators.
  -}
  class Monad m => MonadFEval m where
      -- | Target type that we evaluate to.
      type EvalTo m
  
      -- | Request the value of a variable.
      --
      -- Returns 'Nothing' if the variable is not in scope.
      lookupFVar :: F.Name -> m (Maybe (EvalTo m))
  
      -- | Record some user-facing information concerning evaluation.
      --
      -- For example, you may want to inform the user when you've made a
      -- defaulting decision.
      warn :: String -> m ()
  