Haskell pragmas:OPTIONS_GHC vs LANGUAGE

时间:2015-04-18 17:59:18

标签: haskell language-extension

我发现自己在我的阴谋项目中使用了这种类型的pragma来迫使GHC使用特定的选项进行构建:

{-# OPTIONS_GHC -XFlexibleInstances -XRankNTypes ... #-}

但是当我看到其他人使用扩展时,他们总是以这种方式声明:

{-# LANGUAGE FlexibleInstances, RankNTypes, ... #-}

但是,当我在使用后一种方法的GHCi中加载文件时,GHC总是抱怨我使用unrecognised pragma并立即失败。

为什么GHC不接受LANGUAGE pragma,哪两种更好?


注意:我的GHC版本是最新的:7.8.3,但是当发生这种情况时是7.6。*。

1 个答案:

答案 0 :(得分:12)

使用LANGUAGE编译指示更好。它不是给出任意选项的列表,而是仅针对语言扩展。如GHC文档中所述,它还可以在实现之间移植; LANGUAGE

  

...允许以便携方式启用语言扩展。所有Haskell编译器都希望使用相同的语法支持LANGUAGE编译指示,当然并非所有编译器都支持所有扩展。 如果可能,应使用LANGUAGE pragma而不是OPTIONS_GHC [强调添加]

同样的语言一直显示在文档中GHC 6.6 (§7.10.4)LANGUAGE引入时,直到GHC 7.10.1 (§7.22.1),当前(撰写时)发布。

指定语言扩展的第三种方法是在cabal文件中声明它们。

我还发现使用LANGUAGE pragma为单个文件声明已使用的扩展名是很常见的,但使用OPTIONS_GHC(在单个文件的级别上)通常用作解决方法(例如,禁用一些警告)。人们更喜欢在项目范围内(使用cabal)声明GHC选项而不是单个文件,而由于某些原因,语言扩展通常用于每个文件。

以下是一些猜测可能无法识别LANGUAGE pragma的猜测:

  • 你有一个古老的GHC版本(< 6.6)
  • 您不会将其声明为文件头 pragma。 文件头编译指示必须位于文件中的module关键字之前。换句话说,它应该位于文件的最顶层(尽管它可能在其他文件头编译指示之前)