Несколько исходных файлов в Haskell - PullRequest
4 голосов
/ 19 августа 2010

Я пишу свой первый большой проект на Хаскеле, и я хотел бы разбить его на несколько файлов. До сих пор я написал два модуля, 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. Что не так?

Ответы [ 2 ]

4 голосов
/ 19 августа 2010

Из отчета Haskell :

Реализация модуля может экспортировать только тот объект, который объявлен или импортирован из какого-либо другого модуля.Если список экспорта опущен, экспортируются все значения, типы и классы, определенные в модуле, , но не те, которые импортируются .

Вам либо нужно явно указать экспортсписок, включающий parse в Parse.hs, или импортируйте parse снова в Main.hs.

1 голос
/ 19 августа 2010

Вы также можете сделать это:

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

    parse = P.parse

Но на самом деле это бесполезно. Вам наверняка захочется создать что-то более специфичное для домена поверх Parsec, прежде чем экспортировать его из одного из ваших модулей.

...