Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在GHC中编译_Haskell_Compilation_Ghc - Fatal编程技术网

Haskell 在GHC中编译

Haskell 在GHC中编译,haskell,compilation,ghc,Haskell,Compilation,Ghc,我正在学习Haskell,一个简单的疑问打动了我,这两个使用GHC编译的命令之间有什么区别(fac是一个计算阶乘的程序): ghc-o fac fac.hs 及 ghc fac.hs 现在要运行这个程序,我只需执行fac.exe(我使用的是Windows) 既然两者都有效,哪一个是正确的?二者都哪一个最适合使用?两者都可以。o命令所做的唯一事情就是确定生成的可执行文件的名称。就哈斯克尔而言,这没什么区别 就我个人而言,我喜欢总是使用“-o”使事情显式化(因为我通常喜欢避免隐式默认值),并使它看起

我正在学习Haskell,一个简单的疑问打动了我,这两个使用GHC编译的命令之间有什么区别(fac是一个计算阶乘的程序):

ghc-o fac fac.hs

ghc fac.hs

现在要运行这个程序,我只需执行fac.exe(我使用的是Windows)


既然两者都有效,哪一个是正确的?二者都哪一个最适合使用?

两者都可以。o命令所做的唯一事情就是确定生成的可执行文件的名称。就哈斯克尔而言,这没什么区别


就我个人而言,我喜欢总是使用“-o”使事情显式化(因为我通常喜欢避免隐式默认值),并使它看起来更类似于其他编译器(例如,gcc C编译器会强制您使用“-o”选项,因为它在其他情况下使用的默认名称非常难看)

以前就是这样写的

ghc fac.hs
没有真正起作用。相反,你不得不说

ghc --make fac.hs
区别在于前者编译
fac.hs
而不做其他任何事情,而后者检查
fac.hs
是否使用任何其他需要重新编译的模块,是否自动包含任何需要的包,等等

但是,默认行为已更改,以上两个命令现在是相同的。(我完全忘记了这是什么时候发生的,但那是很久以前的事了。)您可能仍然会看到带有显式
--make
切换的文档和示例,我个人喜欢将其包括在内。但那只是我

-o
开关提供的唯一功能是更改输出名称。如果您有,比如,
Main.hs
,并且希望将输出称为
MyCoolProgram
或其他任何东西,那么这将非常有用。我要说的一件事是:在Linux下,
fac.hs
(如果它是
Main
模块)将编译成名为
fac
的可执行文件,但在Windows下它将被称为
fac.exe
。如果使用
-o
对二进制名称进行硬编码,则不会发生这种情况。我不确定你能不能运行一个不以
.exe
结尾的Windows二进制文件