The typical way I break dependency cycles is by parameterizing something out. In this case, your Function
module might do function parsers for your language, but expressed in such a way that it can do so no matter what the rest of the language is like. Thus:
module Function where
data FunctionBody e = FunctionBody [e]
parseFunctionBody :: Parser e -> Parser (FunctionBody e)
And
module AST where
data SourceElement
= StatementSourceElement Statement
| FunctionSourceElement FunctionName (FunctionBody SourceElement)
Thus the mutual recursion is abstracted into a simple recursion + parameterization. I think parameterization is at least as important as separating different things into different files, so it's kind of nice (and kind of annoying) that one forces the other.