Вопрос

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

Это было полезно?

Решение

От Haskell Report:

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

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

Другие советы

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

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

    parse = P.parse

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top