为啥 Haskell ghc 不工作,但 runghc 工作良好?

Posted

技术标签:

【中文标题】为啥 Haskell ghc 不工作,但 runghc 工作良好?【英文标题】:Why Haskell ghc does not work, but runghc works well?为什么 Haskell ghc 不工作,但 runghc 工作良好? 【发布时间】:2012-01-10 14:35:41 【问题描述】:

一个代码来自 runghc,但我不能用 ghc 命令编译相同的代码。为什么?

以下是我的最小代码和环境: https://gist.github.com/1588756

效果很好:

$ runghc cat.hs

无法编译:

$ ghc cat.hs -o cat

Macbook air、max os x 雪豹

【问题讨论】:

cat.hs 还是cat.cs?将其命名为 cat.hs 并使用 ghc cat.hs -o cat 对我有用(在 Linux 上)。 cat.cs 是我的错误命名。重命名 cat.hs,然后为我工作。谢谢。 【参考方案1】:

粘贴中显示的.cs 扩展名错误;1 将文件重命名为cat.hs 即可。

这个错误信息:

ld: warning: ignoring file cat.cs, file was built for unsupported file format
which is not the architecture being linked (i386)

当你传递一个 GHC 不知道如何处理的文件时发生;它只是将它直接传递给链接器,然后链接器会忽略它,因为 it 也不知道。 :)

1 至少在 GHC 获得 C# 支持之前...

【讨论】:

【参考方案2】:

使用文件名cat.cs,在 linux 上我得到

$ ghc cat.cs
/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld:cat.cs: file format not recognized; treating as linker script
/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld:cat.cs:1: syntax error

确实,由于 GHC 不知道如何处理 .cs 文件,它会将它们按原样传递给 gcc 进行链接,gcc 也不知道,所以回退到将其视为链接器脚本,哪个当然结果不是很好。

但是您可以告诉 GHC 它应该将您提供给它的任何文件视为.hs 文件,

$ ghc -x hs cat.cs
[1 of 1] Compiling Main             ( cat.cs, cat.o )
Linking cat ...

另一方面,runghc 不关心文件的名称,它会尝试将文件解释为普通的 Haskell 源,除非它具有扩展名 .lhs,然后它会尝试将其解释为 literate Haskell .

【讨论】:

以上是关于为啥 Haskell ghc 不工作,但 runghc 工作良好?的主要内容,如果未能解决你的问题,请参考以下文章

在 haskell-stack 中设置 GHC 选项的各种方法如何协同工作

Haskell 的 GHC 未安装

GHC Haskell 中啥时候自动记忆?

Ghc:部分编译 Haskell 代码?

Haskell、GHC、win32、开罗

GHC Haskell 中的自动记忆功能是啥时候?