2013-10-20 11 views
9

非常に基本的な質問を申し訳ありません:GHCiでは、import Library.Name:m +Library.Nameの間に違いがありますか?それらは同等に見えますが、私は代替構文の理由があると仮定します。Haskellライブラリのインポート構文

答えて

6

ソースコードにimportを含めるとより一般的ですが、:mはghci固有のコマンドです(便宜上)。

ghci> :m + Module1 ... ModuleNを使用すると、複数のモジュールを読み込むことができます。モジュールをアンロードする場合は、+の代わりに-を使用してください。 ghciはインタラクティブなので、あなたのワークフローではない限り、:mに固執します:.hsファイルを編集して保存し、リロードしてください。次に、importがより適しています(さらに多くの機能、たとえばqualified imports)。

importディレクティブは、後でたとえばghcを使用してプログラムをコンパイルする場合にも機能します。特定の関数のみを選択的にインポートすることができます。import Data.List (sort)はソートのみをインポートするため、ネームスペースを少なくします。

+1

だから:簡潔さのためだけにm? – planarian

+0

それは私には次のようなことが起こります。mはまた、一旦インポートされるとライブラリの*削除*を許可します。 – planarian

+0

はい、 '+'の代わりに '-'を使用した場合 – jev

9

あなたは正しく、import Module:module + Moduleは同じですが、いくつかの理由があります(これは:mと略記されます)。

  1. これは古いです。 GHCiは実際にはちょうどIOdoブロックの内側に使用されています。今は言語のすべての部分をサポートしていますので、importを実行できます。 (それはGHCi 6.6.x didn't support importが、GHCi 6.8.1 didのように見えます。私たちはGHCi 7.4.1までトップレベルの宣言を完全にサポートを取得できませんでした。)

  2. それはあなたが一度に複数のモジュールをインポートすることができます。 :m + M1 M2 M3は、それぞれ新しい行にそれぞれimport M1,import M2、およびimport M3を書き込むのと同じです。

  3. モジュールをインポートできません。:m - Mは、Mの内容をプロンプトで現在のスコープにあるものから削除します。

  4. スコープが表示されるように、インタープリターモジュールをインポートすることができます。これはあなたが:load File.hs;モジュール*Fileにいることがわかります。などがあります。Fileのすべてのもの、さらにはエクスポートしないものすべてを参照してください。解釈されたモジュールMIがロードされている場合は、:m + M1 *MI M3を使用してM1M2を通常の方法でスコープに持ち込み、MIをスコープに特殊な方法で渡すことができます。

    1. 適格輸入:

    完全にするために、しかし、import構文は、私たちに:mがないという3つのことを提供しません。 import qualified Data.Map as Mを実行してM.lookupを使用すると、Data.Map.lookupを実行する必要があるか、あいまいなエラーが発生する可能性が非常に高いです。 (インストールされているすべてのパッケージはGHCiで完全修飾されているので、import qualified Moduleだけで購入することはできません。)

  5. リストをインポートします。私がMで修飾されたData.Mapの機能を持っていても、私はまだimport Data.Map (Map)を実行して、型をスコープに入れないでください。

  6. インポートhiding。上記の逆。多分私は自分のソートルーチンを書いているので、私はimport Data.List hiding (sort)を行うことができます。

§2.4.5, "What's really in scope at the prompt?", in the GHC (7.6) user's guideをチェックアウトすることもできます。

+0

徹底的な回答ありがとうございます。もし私がまだ「解決済みの」スレッドに印をつけていなかったら、私はそれを選んだでしょう。 – planarian

関連する問題