web-dev-qa-db-ja.com

GHCiにHaskellモジュールをインポートするにはどうすればよいですか?

私は「あなたを大善のためのハスケルを学ぶ」という本から自分にハスケルを教えようとしています。第7章(モジュール)の最後のセクションに行きました。このセクションでは、独自のモジュールを作成する方法を説明しています。このセクションの冒頭の本で提供されているGeometryモジュールのコピーと貼り付けを行いました。ファイルの名前は、本が示唆するようにGeometry.hsで、ファイルはghciのbinディレクトリにあります。これは、以前は:lを使用して別の.hsファイルを正常にロードできた場所です。

GHCiで次のコマンドを入力すると

import Geometry

次のエラーが発生します。

モジュール「Geometry」が見つかりませんでした。現在のプログラムまたは既知のパッケージのモジュールではありません

私は明らかに間違っていることをしているに違いありませんが、それが何であるか理解できません。

19
user1153980

GHCiでimport ModuleNameを使用すると、(ほとんどの場合)import Data.Listと同じように機能します。GHCは、モジュールのローカルパッケージデータベースをチェックし、ロードして、その(エクスポートされた)コンテンツをスコープに取り込みます。

ただし、Geometryghc-pkgでインストールされたパッケージのモジュールではありません。したがって、GHCはモジュールGeometryが存在することをまったく知りません。また、インタラクティブバリアントGHCiも同様です。

しかし、プログラムを:loadすると、状況が変わります。 GHCは使用されているモジュールを考慮に入れます:

-- Foo.hs
module Foo where

foo :: IO ()
foo = putStrLn "Hello from foo!"
-- Main.hs
module Main where
import Foo (foo)

main :: IO ()
main = foo
$ cd /path/to/your/files
$ ghci 
 GHCi、version 7.10.2:http://www.haskell.org/ghc/:?ヘルプ
プレリュード> import Foo 
 
 <no location info>:
モジュール「Foo」[.____が見つかりませんでした。 ] 現在のプログラム、または既知のパッケージのモジュールではありません。
 
 Prelude>:l Main.hs 
 [1 of 2 ] Fooのコンパイル(Foo.hs、解釈済み)
 [2 of 2] Mainのコンパイル(Main.hs、解釈済み)
 OK、ロードされたモジュール:Main、Foo。
 * Main >:l Main.hs 
 * Main> foo 
こんにちはfoo!
 * Main> import Foo 
 * Main Foo> -モジュールがロードされました

ご覧のように、Fooのインポートは最初に失敗しました。ただし、Fooを使用するプログラムを実際にロードした後、GHCiでimport Fooを使用することができました。

したがって、GHCiでimportを使用する場合は、ラッパーに含めるかインストールして、GHCがモジュールを検出できることを確認してください。モジュール自体をロードするだけの場合は、:loadを使用します。

14
Zeta