在底部的代码中,Hint(Language.Haskell.Interpreter)中的两个monadic动作(loadModules
和setImportsQ
)只能在一个顺序中执行,而不能在另一个顺序中执行,如下面的一个最小例子。特别是,loadModules
必须先行,否则在执行解释器时将生成以下异常。
*** Exception: compile error: WontCompile [GhcError {errMsg = "Not in scope: type
constructor or class `Int'"}]
此行为似乎已在Hint 0.4.1.0
中引入。我一定错过了一些明显的东西..
我的第一个问题是特定提示:为什么必须在loadModules
之前调用setImportsQ
?
我的第二个问题更为笼统:似乎这两个monadic动作不会相互输入输入,而且要加载的模块也是空的,为什么命令或执行很重要?这几乎让我想起了一个命令式的世界,你不仅要担心输入/输出,还要担心某些副作用的顺序。
代码如下。请注意,MyModule.hs
是一个空的.hs文件。
module Main where
import Language.Haskell.Interpreter
import Control.Monad
custom=["MyModule"] --mymodule.hs is just an empty .hs source file in the same folder
context=[("Data.Int",Nothing)]
main = do
x <- interp ("1") (as ::Int)
return ()
interp e as_type = do
interpreterResult <- runInterpreter $ do
loadModules custom --this line must go first
setImportsQ context --this line must go second
interpret e as_type
f <- case interpreterResult of
Left e -> error $ "compile error: " ++ show e
Right result -> return result
return f