如何在haskell包中使用数据类型

时间:2017-10-24 08:01:18

标签: haskell

我有三个文件。第一个:

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数据类型?

1 个答案:

答案 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

然后一切正常。