我正在学习我的第一个函数式编程语言,但在初始后勤方面遇到了一些麻烦(教授基本上说,“以某种方式设置它”并没有提供太多细节。)
无论如何,我有Mac OS X版本10.6.8。首先,我在我的主目录中安装了GHC,发现我可以在终端中使用命令“ghci”打开它。从那里(借口我完全缺乏知识),我按照教学大纲中的模糊指示,打开了另一个窗口,其中包含我要修改的a1.hs文件作业。当我完成一个函数的定义时,我输入命令“ghc a1-skeleton.hs”来打开加载到它的解释器(这就是我要做的,对吧?)但是得到了这个错误:
a1.hs:5:8:
Could not find module `System'
It is a member of the hidden package `haskell98-2.0.0.1'.
Use -v to see a list of the files searched for.
我猜这就像错过了一个“#include”或类似C ++这样的语言。我只需要在特定目录中查找/添加内容吗?
另外,由于我没有马上收到这些东西,翻译到底是做什么的?它是一个程序,它在程序语言意义上跳过'编译'并且只是试图直接遵循.hs文件中的命令吗?
谢谢!
UPDATE ::似乎是问题的代码:
2 module Main where
3
4 import Test.HUnit
5 import System
答案 0 :(得分:8)
问题可能是System
模块是旧的非分层名称。我认为您现在需要使用类似System.Environment
之类的模块(取决于您要导入的确切函数)。
由于您没有使用这些模块中的任何功能,我无法准确地告诉您要导入的内容。在GHCi中,您可以查看模块定义的功能如下:
Prelude> :browse System.Environment
getArgs :: IO [String]
getEnv :: String -> IO String
getEnvironment :: IO [(String, String)]
getProgName :: IO String
withArgs :: [String] -> IO a -> IO a
withProgName :: String -> IO a -> IO a
您可以尝试删除import System
语句并加载文件。然后,您应该获得一些不在范围内的标识符。现在,您可以将这些内容输入Hoogle(这将是您最好的朋友,巧合),以查看它们的定义位置。
我的理解是,旧System
模块中的功能现在位于System.Environment
,System.Process
和System.Exit
。如果你不想过于深入思考它,你可以直接导入所有三个:P。
答案 1 :(得分:3)
您刚刚安装了GHC - 您可能希望安装Haskell Platform - 这是GHC的“电池包含”版本。它附带了许多你需要的软件包,它还提供了cabal
,它是Haskell的软件包管理器。通过这种方式,您可以避免许多“无法找到模块”错误,否则您将遇到这些错误。
单击安装也不会造成伤害。
答案 2 :(得分:2)
尝试在终端中使用ghci -package haskell98 a1-skeleton.hs
打开它。如果它不起作用,请在您的问题中添加完整的a1-skeleton.hs
。
答案 3 :(得分:2)
关于你的小问题:
ghci也进行编译,但与非交互式ghc不同,它不会创建有效的机器代码,而是编译为更简单的内部字节码,然后直接解释。基本上ghci已经过优化,可以进行快速编译(正如您希望的那样快速开发),而不是让结果快速运行。
此外,它还包含其他用于交互式使用的有用内容,例如read-eval-print循环和调试器。
答案 4 :(得分:1)
1)最好安装haskell平台,而不是单独安装GHC。在没有cabal-install的情况下工作很麻烦,并且构建它并不总是那么容易,特别是在最近的ghc版本上。
2)ghc使用复杂的包装系统 - cabal。 System
模块由Haskell98软件包导出,默认情况下会被屏蔽,应该显式启用。对于ghc和ghci,使用-package
开关完成(参见ghc的在线文档)
3)最好使用base
包而不是Haskell98
或Haskell2010
。
===
ghci将源编译为字节码,默认情况下不会保存在磁盘上。如果需要,它还链接任何外部库/包,并且在某些特定情况下可能无法执行此操作。