5

我正在学习我的第一个函数式编程语言,但在最初的后勤方面遇到了一些麻烦(教授基本上说,“以某种方式设置它”并且没有提供太多细节。)

无论如何,我有 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.

我猜这就像在 C++ 之类的语言中缺少“#include”或类似的东西。我只需要在特定目录中查找/添加一些东西吗?

另外,由于我没有马上理解这些东西,解释器到底是做什么的?它是在程序语言意义上跳过“编译”并只是尝试立即遵循 .hs 文件中的命令的程序吗?

谢谢!

更新:: 似乎是问题的代码:

  2 module Main where
  3 
  4 import Test.HUnit
  5 import System
4

5 回答 5

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.ProcessSystem.Exit. 如果您不想深入思考它,则可以导入所有三个:P。

于 2012-09-04T01:00:26.943 回答
3

您刚刚安装了 GHC——您可能想要安装Haskell 平台——这是 GHC 的“包含电池”版本。它带有很多你需要的包,它还提供cabal了一个 Haskell 的包管理器。这样,您将避免很多“找不到模式”错误,否则会遇到这些错误。

一键安装也没有什么坏处。

于 2012-09-04T01:40:52.210 回答
2

尝试ghci -package haskell98 a1-skeleton.hs在终端中打开它。如果它不起作用,a1-skeleton.hs请在您的问题中包含完整的内容。

于 2012-09-04T00:57:39.857 回答
2

关于你的小问题:

ghci 也进行编译,但与非交互式 ghc 不同,它不会创建高效的机器代码,而是编译为更简单的内部字节码,然后直接解释。基本上 ghci 已针对进行快速编译进行了优化(就像您希望快速开发一样),而不是使结果快速运行。

此外,它还包含其他用于交互使用的有用内容,例如 read-eval-print 循环和调试器。

于 2012-09-04T02:28:04.813 回答
1

1)最好安装haskell平台,而不是单独安装GHC。在没有 cabal-install 可用的情况下工作很痛苦,而且构建它并不总是那么容易,尤其是在最近的 ghc 版本上。

2) ghc 使用复杂的包装系统——cabal。System模块由 Haskell98 包导出,默认情况下被屏蔽,应显式启用。对于 ghc 和 ghci,它是使用-packageswitch 完成的(参见 ghc 的在线文档)

3)最好使用basepackage 而Haskell98不是Haskell2010.

===

ghci 将源代码编译为字节码,默认情况下不保存在磁盘上。如果需要,它还会链接任何外部库/包,在某些特定情况下可能会失败。

于 2012-09-04T10:15:06.057 回答