The hint
package offers a somewhat restricted, but perhaps more understandable interface to the GHC API. Perhaps it is sufficient for your purposes? If not, you can perhaps look at the sources to get a better idea of how to use the GHC API directly.
Here's an example program:
import Language.Haskell.Interpreter
main :: IO ()
main = do
r <- runInterpreter $ do
setImports ["Prelude"]
typeOf "map (+1)"
either print putStrLn r
If run, this prints
Num b => [b] -> [b]