Несколько исходных файлов в Haskell

Я пишу свой первый большой проект на 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. Что случилось?


person Igor    schedule 19.08.2010    source источник


Ответы (2)


Из отчета Haskell:

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

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

person Travis Brown    schedule 19.08.2010

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

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

    parse = P.parse

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

person Michael Melanson    schedule 19.08.2010