我正在Haskell编写我的第一个大项目,我想将它分成多个文件。到目前为止,我已经编写了两个模块Parse
和Eval
。我想要一个Main
模块,它只包含这两个模块并指定main
函数。我有Main.hs
,Parse.hs
和Eval.hs
文件并将其导入Main
,但会发生这种情况:
Prelude> :load "~/code/haskell/lisp/Main.hs"
[1 of 3] Compiling Eval ( Eval.hs, interpreted )
[2 of 3] Compiling Parse ( Parse.hs, interpreted )
[3 of 3] Compiling Main ( ~/code/haskell/lisp/Main.hs, interpreted )
Ok, modules loaded: Main, Parse, Eval.
*Main> parse parseExpr "" "#b101"
<interactive>:1:0: Not in scope: `parse'
parse
函数来自Parsec库,它在Parse.hs
中导入。怎么了?
答案 0 :(得分:4)
模块实现可能只是 导出它声明的实体,或 它从其他一些进口 模块。如果省略导出列表, 定义了所有值,类型和类 在模块中导出,但不是 那些导入的。
您需要在parse
中提供包含Parse.hs
的明确导出列表,或在parse
中再次导入Main.hs
。
答案 1 :(得分:1)
你也可以这样做:
module Parse (parse) where
import qualified Text.ParserCombinators.Parsec as P
parse = P.parse
但实际上,这是没用的。在从Parsec模块中导出之前,您肯定希望在Parsec之上构建更具域特性的东西。