我有三个文件。第一个:
module AST where
data Prog a b = ...
第二个
module ParseProg where
import qualified AST as A
progToAST :: String -> A.Prog String String
这是用于家庭作业的包的一部分。我用
安装了它$ cabal configure
$ cabal build
$ cabal install
似乎有效。我的第三个程序(测试)是
import ParseProg
val1 = progToAST "x"
-- prog :: A.Prog String String
fun1 :: Int -> Int
fun1 x = 2
-- val2 = fun1 val1
因此导入工作。如果我取消注释,我得到
Not in scope: type constructor or class ‘A.Prog’
如果我尝试Prog或AST.Prog也一样。检查val1的类型
> :type val1
> val1 :: CabParser-0.1.0.0:AST.Prog String String
同样取消注释val2给出了
Couldn't match expected type ‘Int’
with actual type ‘CabParser-0.1.0.0:AST.Prog String String’
复制CabParser-0.1 ....会出现解析错误。如何在AST中使用Prog数据类型?
答案 0 :(得分:4)
第一个问题是我没有在第三个文件中导入AST,因此它变为:
import ParseProg
import AST as A
然而,这会产生错误
"Could not find module ‘AST’ it is a hidden module in the package ‘CabParser-0.1.0.0@CabPa_<nonsense>"
由于某种原因,AST是我正在使用的CabParser包中的隐藏模块,所以我必须使它成为一个暴露的模块。在程序包目录中的CabParser.cabal中,我将AST添加到公开的模块中:
exposed-modules: ParseProg, AST
并将其从其他模块行中删除。然后我用
再次构建和安装$ cabal configure
$ cabal build
$ cabal install
然后一切正常。