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 даст вам полный список всех доступных команд.

Другие вопросы по тегам