Haskell — подавление ошибок импорта

#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 нет опции, позволяющей выполнять компиляцию, когда импортированный модуль не может быть найден.