#haskell #ghc #haskell-stack
Вопрос:
У меня есть куча файлов Haskell, которые мне нужно скомпилировать с помощью GHC, но некоторые библиотеки импорта не существуют. Есть ли способ подавить ошибку компилятора: Could not find module
, и заставить ее возникать только во время выполнения? Что-то вроде -fdefer-type-errors
этого, но для импорта.
Редактирование файлов в данный момент не является опцией, и большинство импортируемых файлов даже не используются программой, поэтому никогда не будут выбрасываться, если она будет скомпилирована.
Комментарии:
1. Вы можете определить функции как
undefined
в верхней части вашего файла в качестве «заполнителя». Поэтому, если вам нужна функцияfoo
, напишитеfoo = undefined
. Используйтеfoo
везде, где это необходимо. Если позже вы сможете импортироватьfoo
, то сможете удалитьfoo = undefined
ошибку.2. Не совсем возможно создать пустую библиотеку для каждого из этих фиктивных импортных файлов, так как существует много разных
3. но вам не нужно создавать пустую библиотеку. Вы просто помещаете заполнители в модуль, в котором используете эту функцию.
4. Есть
-fdefer-out-of-scope-variables
, но тогда вам все равно придется прокомментировать инструкции по импорту.5. Я даже никогда не использую эти функции, так что единственная проблема-это сам оператор импорта. Тем не менее, для меня не так просто редактировать сами файлы, поэтому я ищу обходной путь, чтобы превратить ошибку в предупреждение или что-то в этом роде
Ответ №1:
Вы можете использовать cabal mixins
для предоставления других существующих модулей с именами модулей, которые вы хотите создать. Например, у вас может быть файл:
module MyLib (someFunc) where
import Module1
import Module2
someFunc :: IO ()
someFunc = putStrLn "someFunc"
Так Module1
и Module2
не существуют на самом деле. Но вы можете указать эти модули на что угодно, например, Data.Map
с Data.Set
помощью файла cabal:
library
exposed-modules: MyLib
-- Modules included in this library but not exported.
-- other-modules:
-- LANGUAGE extensions used by modules in this package.
-- other-extensions:
build-depends: base ^>=4.14.0.0, containers
hs-source-dirs: src
default-language: Haskell2010
mixins:
containers (Data.Map as Module1, Data.Set as Module2)
Ответ №2:
В GHC нет опции, позволяющей выполнять компиляцию, когда импортированный модуль не может быть найден.