Hint中两个monadic动作的奇怪执行顺序要求(Language.Haskell.Interpreter)

时间:2014-04-30 18:32:41

标签: haskell ghc hint side-effects

在底部的代码中,Hint(Language.Haskell.Interpreter)中的两个monadic动作(loadModulessetImportsQ)只能在一个顺序中执行,而不能在另一个顺序中执行,如下面的一个最小例子。特别是,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

0 个答案:

没有答案