Haskell无法编译

时间:2019-12-28 00:54:10

标签: haskell haskell-stack ghci haskell-platform winghci

我是Haskell的初学者,并且创建了一个helloworld.hs文件,其中包含以下行:

main = putStrLn "hello, world"

当我尝试使用--make helloworld进行编译时,它不会在终端中写入任何内容,也不会编译或创建任何.exe或.o文件。 我尝试了很多版本:

$ ghc --make helloworld
$ ghc --make helloworld.hs
ghc --make helloworld
ghc --make helloworld.hs
--make helloworld
--make helloworld.hs

但是这些似乎都不起作用... 我什至尝试使用--version查找版本,但是GHCi只是忽略了它,什么也没写。

我在网上搜索了所有内容,但是找不到任何解决方案。

请帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

只需清楚一点,在命令中:

$ ghc --make helloworld
$ ghc --make helloworld.hs

美元符号不属于您输入的内容。相反,$是各种Unix Shell(即Unix命令行)的“标准”提示,因此仅包含在说明中,这些命令应在命令行中输入这些命令,而不是,例如,从GHCi内部。

我不知道您在哪里看到--make helloworld--make helloworld.hs变体,或者在什么情况下它们会起作用。

实际上唯一可以正常使用的是在命令行中输入的字符串ghc --make helloworldghc --make helloworld.hs(不在GHCi中!)。此外,--make参数是完全可选的(.hs文件后缀也是可选的,但包括它可能是一个好习惯)。

因此,要保存大量毫无意义的变化,请集中精力测试以下命令:

ghc helloworld.hs

键入Windows Command Prompt或PowerShell窗口。如果您无法使用此工具,则没有其他变体可以做到这一点。

这就是我在新的Windows 10虚拟机中所做的事情。

  1. 我从this pagethis direct link下载了最小的Windows安装程序(268MB)。
  2. 我以普通用户身份而非管理员身份运行了安装程序可执行文件,并接受了所有默认安装选项。
  3. 从“开始”菜单中,启动了命令提示符AKA“ cmd”,并确保我位于默认用户目录“ C:\ Users \ buhr”中。
  4. 使用每个程序员喜欢的编辑器记事本,我创建一个包含单行的“ C:\ Users \ buhr \ helloworld.hs”文件:

    main = putStrLn "Hello, world!"
    
  5. 在提示符后的命令提示符窗口中,我输入了ghc helloworld.hs。窗口中的文本如下所示:

    enter image description here

  6. 然后我运行我的helloworld可执行文件:

    enter image description here

要注意的两个关键事项

首先,如果源文件包含module行,且模块名称不是Main,例如:

module MyModule where

然后GHC将文件编译为模块,但不会生成可执行文件。其次,在未更改的源文件上重新运行GHC不会执行任何操作:

enter image description here

因为GHC仅在程序更改时才会重建程序。这两个因素的结合可能使GHC似乎什么也不做(即,它编译了您的模块,但是在您第一次运行它时却没有生成可执行文件,即使GHCi在您运行时也已经编译了您的模块)正在工作),现在运行GHC却无济于事,因为源文件没有更改。