如何在GHCi中导入Haskell模块?

时间:2015-07-30 19:38:19

标签: haskell import ghci

我正在尝试从“为了好大而学习你的哈斯克尔”一书中自学Haskell。我到了第7章(模块)的最后一部分,它讲述了如何创建自己的模块。我在本节开头的书中给出了几何模块的复制和粘贴。该文件的名称是Geometry.hs,正如本书所建议的那样,该文件位于ghci的bin目录中,这是我之前能够使用以下方法成功加载的地方:l用于另一个.hs文件。

当我在GHCi中输入以下命令时

import Geometry

我收到以下错误:

  

无法找到模块'Geometry'它不是当前的模块   程序或任何已知的包

我必须做一些明显错误的事情,但我无法弄清楚它是什么。

3 个答案:

答案 0 :(得分:13)

当您在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/  :? for help
Prelude> import Foo

<no location info>:
    Could not find module ‘Foo’
    It is not a module in the current program, or in any known package.

Prelude> :l Main.hs
[1 of 2] Compiling Foo              ( Foo.hs, interpreted )
[2 of 2] Compiling Main             ( Main.hs, interpreted )
Ok, modules loaded: Main, Foo.
*Main> :l Main.hs
*Main> foo
Hello from foo!
*Main> import Foo
*Main Foo> -- module now loaded

如您所见,首先导入Foo失败。但是,在我们实际加载使用Foo的程序后,我们可以在GHCi中使用import Foo

因此,如果您想在GHCi中使用import,请确保GHC可以通过将其包含在包装器中或安装它来找到您的模块。如果您只想加载模块本身,请使用:l oad。

答案 1 :(得分:1)

TLDR:Learn you a Haskell 一书中没有提到您必须先:load Geometry.hs 文件。然后 :m 返回 Prelude,然后 import Geometry 起作用。

答案 2 :(得分:0)

现在还可以在安装包时添加 lib 标志,即运行 cabal install --lib packagename 然后直接在 GHCi 中导入相应的包。在本例中,例如 cabal install --lib hgeometry 将有助于从 this geometry package 导入模块。