我正在尝试从“为了好大而学习你的哈斯克尔”一书中自学Haskell。我到了第7章(模块)的最后一部分,它讲述了如何创建自己的模块。我在本节开头的书中给出了几何模块的复制和粘贴。该文件的名称是Geometry.hs,正如本书所建议的那样,该文件位于ghci的bin目录中,这是我之前能够使用以下方法成功加载的地方:l用于另一个.hs文件。
当我在GHCi中输入以下命令时
import Geometry
我收到以下错误:
无法找到模块'Geometry'它不是当前的模块 程序或任何已知的包
我必须做一些明显错误的事情,但我无法弄清楚它是什么。
答案 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 导入模块。