Haskell 编译指示:OPTIONS_GHC 与语言
Haskell pragmas: OPTIONS_GHC vs LANGUAGE
我发现自己在我的 cabal 项目中经常使用这种 pragma 来强制 GHC 使用特定选项进行构建:
{-# OPTIONS_GHC -XFlexibleInstances -XRankNTypes ... #-}
但是当我看到其他人使用扩展时,他们总是这样声明:
{-# LANGUAGE FlexibleInstances, RankNTypes, ... #-}
然而,当我在使用后一种方法的 GHCi 中加载文件时,GHC 总是抱怨我使用的是 unrecognised pragma
并立即失败。
为什么 GHC 不接受 LANGUAGE
pragma,两者哪个更好?
注意:我的 GHC 版本是最新的:7.8.3,但发生这种情况时是 7.6.*。
使用 LANGUAGE
pragma 更好。它没有给出任意选项的列表,而是仅特定于语言扩展。如 GHC 文档中所述,它还被设计为在实现之间可移植; LANGUAGE
…allows language extensions to be enabled in a portable way. It is the intention that all Haskell compilers support the LANGUAGE
pragma with the same syntax, although not all extensions are supported by all compilers, of course. The LANGUAGE
pragma should be used instead of OPTIONS_GHC
, if possible. [Emphasis added]
从 GHC 6.6 (§7.10.4), when LANGUAGE
was introduced, up through GHC 7.10.1 (§7.22.1) 当前(撰写本文时)版本开始,文档中就出现了相同的语言。
指定语言扩展的第三种方法是在 cabal 文件中声明它们。
我还发现通常使用 LANGUAGE
pragma 来声明单个文件使用的扩展名,但使用 OPTIONS_GHC
(在单个文件级别)通常用作解决方法(例如禁用某些警告)。人们更喜欢在项目范围内(使用 cabal)而不是在单个文件上声明 GHC 选项,而出于某种原因,语言扩展通常在每个文件的基础上使用。
以下是一些无法识别 LANGUAGE
pragma 的疯狂猜测:
- 你有一个古老的 GHC 版本 (< 6.6)
- 您没有将其声明为 file-header pragma。
文件头编译指示必须位于文件中的
module
关键字之前。换句话说,它应该位于文件的最顶部(尽管它之前可能有其他文件头编译指示)
我发现自己在我的 cabal 项目中经常使用这种 pragma 来强制 GHC 使用特定选项进行构建:
{-# OPTIONS_GHC -XFlexibleInstances -XRankNTypes ... #-}
但是当我看到其他人使用扩展时,他们总是这样声明:
{-# LANGUAGE FlexibleInstances, RankNTypes, ... #-}
然而,当我在使用后一种方法的 GHCi 中加载文件时,GHC 总是抱怨我使用的是 unrecognised pragma
并立即失败。
为什么 GHC 不接受 LANGUAGE
pragma,两者哪个更好?
注意:我的 GHC 版本是最新的:7.8.3,但发生这种情况时是 7.6.*。
使用 LANGUAGE
pragma 更好。它没有给出任意选项的列表,而是仅特定于语言扩展。如 GHC 文档中所述,它还被设计为在实现之间可移植; LANGUAGE
…allows language extensions to be enabled in a portable way. It is the intention that all Haskell compilers support the
LANGUAGE
pragma with the same syntax, although not all extensions are supported by all compilers, of course. TheLANGUAGE
pragma should be used instead ofOPTIONS_GHC
, if possible. [Emphasis added]
从 GHC 6.6 (§7.10.4), when LANGUAGE
was introduced, up through GHC 7.10.1 (§7.22.1) 当前(撰写本文时)版本开始,文档中就出现了相同的语言。
指定语言扩展的第三种方法是在 cabal 文件中声明它们。
我还发现通常使用 LANGUAGE
pragma 来声明单个文件使用的扩展名,但使用 OPTIONS_GHC
(在单个文件级别)通常用作解决方法(例如禁用某些警告)。人们更喜欢在项目范围内(使用 cabal)而不是在单个文件上声明 GHC 选项,而出于某种原因,语言扩展通常在每个文件的基础上使用。
以下是一些无法识别 LANGUAGE
pragma 的疯狂猜测:
- 你有一个古老的 GHC 版本 (< 6.6)
- 您没有将其声明为 file-header pragma。
文件头编译指示必须位于文件中的
module
关键字之前。换句话说,它应该位于文件的最顶部(尽管它之前可能有其他文件头编译指示)