Haskell: выгрузить модуль в WinGHCi
Я загрузил два модуля (NeededModule1.hs и NeededModule2.hs, как указано в Haskell: загрузка ВСЕХ файлов в текущем пути к каталогу). Теперь я хочу выгрузить NeededModule2.hs. Однако я обнаружил функцию 'unload' в System.Plugins.Load, но в WinGHCi она не работала. Я получил сообщение об ошибке:
>unload NecessaryModule2
<interactive>:1:1: Not in scope: `unload'
<interactive>:1:8:
Not in scope: data constructor `NecessaryModule2'
Я старался
import System.Plugins.Load
но это не сработало. Есть ли способ выгрузки модулей описанным выше способом?
-------------------------------------------------- -------------------------------------
[ОТВЕТ НА Риккардо]
Привет, Риккардо, я попробовал ваше предложение, но не смог заставить его работать в WinGHCi. У меня был файл NeededModule1.hs следующим образом:
module NecessaryModule1 where
addNumber1 :: Int -> Int -> Int
addNumber1 a b = a + b
Я пошел в местоположение файла с помощью команды:: cd, а затем сделал:
> :module +NecessaryModule1
<no location info>:
Could not find module `NecessaryModule1':
it is not a module in the current program, or in any known package.
Это правильно? Спасибо [РЕДАКТИРОВАТЬ: см. Ниже для исправления]
-------------------------------------------------- -------------------------------------
[ИСПРАВЛЕНИЕ ВЫШЕ]
Чтобы объяснить, почему вышеприведенное неверно (как объяснил Риккардо), необходимо сделать следующее:
Если у нас есть файл NeededModule1.hs следующим образом:
--NecessaryModule1.hs
module NecessaryModule1 where
addNumber1 :: Int -> Int -> Int
addNumber1 a b = a + b
тогда мы делаем:
> :load NecessaryModule1
[1 of 1] Compiling NecessaryModule1 ( NecessaryModule1.hs, interpreted )
Ok, modules loaded: NecessaryModule1.
> addNumber1 4 5
9
> :module -NecessaryModule1
> addNumber1 4 5
<interactive>:1:1: Not in scope: `addNumber1'
1 ответ
Установленные модули
Вы должны использовать команды ghci для загрузки (:module +My.Module
) и выгрузить (:module -My.Module
) установленные модули. Вы также можете использовать :m
вместо :module
чтобы меньше писать, вот так:
Prelude> :m +Data.List
Prelude Data.List> sort [3,1,2]
[1,2,3]
Prelude Data.List> :m -Data.List
Prelude> sort [3,1,2]
<interactive>:1:1: Not in scope: `sort'
Помните, что приглашение ghci всегда напоминает импортируемый в данный момент модуль: вы можете посмотреть на него, чтобы узнать, что выгрузить с помощью :m -Module.To.Unload
,
Конкретные файлы
Если модуль, который вы пытаетесь загрузить, не установлен в системе (например, вы написали исходный код и просто сохранили файл где-то), вам нужно использовать другую команду, :load filename.hs
, Более быстрый способ - передать путь к файлу напрямую в качестве аргумента командной строки ghci
например, ghci filename.hs
, Если вы бежите winghci
и вы связали это с .hs
расширение, просто дважды щелкните файл.
В обоих случаях вы получите приглашение ghci с указанным модулем, правильно загруженным и импортированным в область (при условии, что у вас нет ошибок компиляции). Как и раньше, теперь вы можете использовать :m [+/-] My.Module
загружать и выгружать модули, но учтите, что это отличается от :load
так как :module
предполагает, что ты уже :load
что вы пытаетесь получить / выйти из области видимости.
Например, если у вас есть test.hs
module MyModule where
import Data.List
f x = sort x
вы можете загрузить его, дважды щелкнув по нему (в окнах с winghci), набрав ghci test.hs
в консоли или загрузкой ghci
и печатать :load test.hs
(остерегайтесь относительных / абсолютных путей).
Еще одна полезная команда ghci :reload
, который перекомпилирует модуль, который вы загрузили ранее. Используйте его, когда вы изменяете исходный файл и хотите быстро обновить модуль, загруженный в ghci.
Prelude> :load test.hs
[1 of 1] Compiling MyModule ( test.hs, interpreted )
Ok, modules loaded: MyModule.
*MyModule> let xs = [1,2,3] in sort xs == f xs
True
*MyModule> :reload
Ok, modules loaded: MyModule.
:help
даст вам полный список всех доступных команд.