Несколько исходных файлов в Haskell
-
29-09-2019 - |
Вопрос
Я пишу свой первый большой проект в Хаскелле, и я хотел бы разделить его на несколько файлов. Пока что я написал два модуля, 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, прежде чем экспортировать его из одного из ваших модулей.