Haskell中的多个源文件

时间:2010-08-19 16:30:31

标签: haskell compilation ghci

我正在Haskell编写我的第一个大项目,我想将它分成多个文件。到目前为止,我已经编写了两个模块ParseEval。我想要一个Main模块,它只包含这两个模块并指定main函数。我有Main.hsParse.hsEval.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中导入。怎么了?

2 个答案:

答案 0 :(得分:4)

来自Haskell report

  

模块实现可能只是   导出它声明的实体,或   它从其他一些进口   模块。如果省略导出列表,   定义了所有值,类型和类   在模块中导出,但不是   那些导入的

您需要在parse中提供包含Parse.hs的明确导出列表,或在parse中再次导入Main.hs

答案 1 :(得分:1)

你也可以这样做:

module Parse (parse) where
    import qualified Text.ParserCombinators.Parsec as P

    parse = P.parse

但实际上,这是没用的。在从Parsec模块中导出之前,您肯定希望在Parsec之上构建更具域特性的东西。