我如何在计算机上使用Haskell?

时间:2012-09-04 00:38:34

标签: haskell functional-programming

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

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

5 个答案:

答案 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.EnvironmentSystem.ProcessSystem.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包而不是Haskell98Haskell2010

===

ghci将源编译为字节码,默认情况下不会保存在磁盘上。如果需要,它还链接任何外部库/包,并且在某些特定情况下可能无法执行此操作。