6

Haskell で最初の大きなプロジェクトを作成していて、それを複数のファイルに分割したいと考えています。これまでに、2 つのモジュールParseEval. Mainこれら2つのモジュールだけを含み、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ます。どうしたの?

4

2 に答える 2

5

Haskellレポートから:

モジュールの実装は、それが宣言するエンティティ、または他のモジュールからインポートするエンティティのみをエクスポートできます。エクスポート リストを省略すると、モジュールで定義されているすべての値、型、およびクラスがエクスポートされますが、インポートされたものはエクスポートされません

を含む明示的なエクスポート リストを指定するか、 に再度インポートする必要parseがあり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

でも、実はこれは駄目です。モジュールの 1 つからエクスポートする前に、Parsec の上にさらにドメイン固有のものを構築したいと思うでしょう。

于 2010-08-19T17:41:54.940 に答える