提示(Language.Haskell.transparer)中两个单元操作的奇怪执行顺序要求
在底部的代码中,Hint(Language.Haskell.解释器)中的两个一元操作(提示(Language.Haskell.transparer)中两个单元操作的奇怪执行顺序要求,haskell,ghc,hint,side-effects,Haskell,Ghc,Hint,Side Effects,在底部的代码中,Hint(Language.Haskell.解释器)中的两个一元操作(loadModules和setImportsQ)只能按一个顺序执行,而不能按另一个顺序执行,如下面的最小示例所示。特别是,loadModules必须先执行,否则在执行解释器时将生成以下异常 *** Exception: compile error: WontCompile [GhcError {errMsg = "Not in scope: type constructor or class `Int'"}]
loadModules
和setImportsQ
)只能按一个顺序执行,而不能按另一个顺序执行,如下面的最小示例所示。特别是,loadModules
必须先执行,否则在执行解释器时将生成以下异常
*** Exception: compile error: WontCompile [GhcError {errMsg = "Not in scope: type
constructor or class `Int'"}]
此行为似乎已在提示0.4.1.0
中引入。我一定错过了什么明显的东西
我的第一个问题是特定于提示的:为什么必须在setImportsQ
之前调用loadModules
我的第二个问题更一般:这两个一元操作似乎没有相互输入,而且要加载的模块是空的,为什么顺序或执行很重要?这几乎让我想起了命令式世界,在那里你不仅要担心输入/输出,还要担心某些副作用的顺序
代码如下。请注意,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
modulemain其中
导入Language.Haskell.Interpreter
进口管制
custom=[“MyModule”]--MyModule.hs只是同一文件夹中的一个空.hs源文件
上下文=[(“Data.Int”,无任何内容)]
main=do
x