@@ -134,9 +134,10 @@ addExport exports name =
134134--
135135desugarImports :: [Module] -> Either String [Module]
136136desugarImports modules = do
137− unfilteredExports <- findExports modules
138− exports <- foldM filterModuleExports unfilteredExports modules
139− mapM (renameInModule' unfilteredExports exports) modules
137+ let modules' = importPrelude `map` modules
138+ unfilteredExports <- findExports modules'
139+ exports <- foldM filterModuleExports unfilteredExports modules'
140+ mapM (renameInModule' unfilteredExports exports) modules'
140141 where
141142
142143 -- Filters the exports for a module in the global exports environment so that only explicitly
@@ -155,6 +156,19 @@ desugarImports modules = do
155156 imports <- resolveImports env m
156157 renameInModule imports env (elaborateExports exps m)
157158
159+-- |
160+-- Add an import declaration for the Prelude to a module if it does not already explicitly import
161+-- it.
162+--
163+importPrelude :: Module -> Module
164+importPrelude m@(Module mn decls exps) =
165+ if isPreludeImport `any` decls then m
166+ else Module mn (preludeImport : decls) exps
167+ where
168+ isPreludeImport (ImportDeclaration (ModuleName [ProperName "Prelude"]) _ _) = True
169+ isPreludeImport _ = False
170+ preludeImport = ImportDeclaration (ModuleName [ProperName "Prelude"]) Nothing Nothing
171+
158172-- |
159173-- Rethrow an error with the name of the current module in the case of a failure
160174--