私は「あなたを大善のためのハスケルを学ぶ」という本から自分にハスケルを教えようとしています。第7章(モジュール)の最後のセクションに行きました。このセクションでは、独自のモジュールを作成する方法を説明しています。このセクションの冒頭の本で提供されているGeometryモジュールのコピーと貼り付けを行いました。ファイルの名前は、本が示唆するようにGeometry.hsで、ファイルはghciのbinディレクトリにあります。これは、以前は:lを使用して別の.hsファイルを正常にロードできた場所です。
GHCiで次のコマンドを入力すると
import Geometry
次のエラーが発生します。
モジュール「Geometry」が見つかりませんでした。現在のプログラムまたは既知のパッケージのモジュールではありません
私は明らかに間違っていることをしているに違いありませんが、それが何であるか理解できません。
GHCiでimport ModuleName
を使用すると、(ほとんどの場合)import Data.List
と同じように機能します。GHCは、モジュールのローカルパッケージデータベースをチェックし、ロードして、その(エクスポートされた)コンテンツをスコープに取り込みます。
ただし、Geometry
はghc-pkg
でインストールされたパッケージのモジュールではありません。したがって、GHCはモジュールGeometry
が存在することをまったく知りません。また、インタラクティブバリアントGHCiも同様です。
しかし、プログラムを:l
oadすると、状況が変わります。 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がモジュールを検出できることを確認してください。モジュール自体をロードするだけの場合は、:l
oadを使用します。