我发现自己在我的阴谋项目中使用了这种类型的pragma来迫使GHC使用特定的选项进行构建:
{-# OPTIONS_GHC -XFlexibleInstances -XRankNTypes ... #-}
但是当我看到其他人使用扩展时,他们总是以这种方式声明:
{-# LANGUAGE FlexibleInstances, RankNTypes, ... #-}
但是,当我在使用后一种方法的GHCi中加载文件时,GHC总是抱怨我使用unrecognised pragma
并立即失败。
为什么GHC不接受LANGUAGE
pragma,哪两种更好?
注意:我的GHC版本是最新的:7.8.3,但是当发生这种情况时是7.6。*。
答案 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的猜测:
module
关键字之前。换句话说,它应该位于文件的最顶层(尽管它可能在其他文件头编译指示之前)