6

2 つのモジュール (NecessaryModule1.hs と NecessaryModule2.hs を Haskell で outlinked としてロード: 現在のディレクトリ パスにすべてのファイルをロード)。次に、NecessaryModule2.hs をアンロードします。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

しかし、それはうまくいきませんでした。上記の方法でモジュールをアンロードする方法はありますか?

-------------------------------------------------- --------------------------------------

[リカルドへの返答]

こんにちはRiccardo、私はあなたの提案を試しましたが、WinGHCiで動作させることができませんでした. 次のようなファイル NecessaryModule1.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.

これは正しいです?ありがとう[編集:修正については以下を参照]

-------------------------------------------------- --------------------------------------

[上に訂正]

上記が正しくない理由を説明するためだけに (Riccardo が説明したように)、次のことを行う必要があります。

次のようなファイル NecessaryModule1.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'
4

1 に答える 1

16

インストール済みモジュール

インストールされたモジュールをロード ( :module +My.Module) およびアンロード ( )するには、ghci のコマンドを使用する必要があります。次のように、少なく書くために代わりに ofを: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.hsghciより迅速な方法は、コマンドライン引数としてファイルへのパスを直接渡すことですghci filename.hs。実行winghciして拡張機能に関連付けた場合.hsは、ファイルをダブルクリックするだけです。

どちらの場合も、指定されたモジュールが正しくロードされ、スコープにインポートされた ghci プロンプトが表示されます (代わりに get コンパイル エラーがない場合)。以前と同様に、 を使用してモジュールをロードおよびアンロードできるよう: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(相対/絶対パスに注意してください) ことによってロードできます。

もう 1 つの便利な 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使用可能なすべてのコマンドの完全なリストが表示されます。

于 2012-04-24T10:02:41.103 に答える