6

我正在用 Haskell 编写我的第一个大项目,我想将它拆分为多个文件。到目前为止,我已经编写了两个模块,Parse并且Eval. 我想要一个Main只包含这两个模块并指定main功能的模块。我有文件Main.hs,Parse.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. 怎么了?

4

2 回答 2

5

来自Haskell 报告

模块实现只能导出它声明的实体,或者它从其他模块导入的实体。如果省略导出列表,则模块中定义的所有值、类型和类都将被导出,但不会被导入

您要么需要提供包含parsein的明确导出列表Parse.hs,要么parseMain.hs.

于 2010-08-19T16:41:43.667 回答
1

你也可以这样做:

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

    parse = P.parse

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

于 2010-08-19T17:41:54.940 回答