是否应该使用GHC Haskell扩展?


78

在学习Haskell的过程中,我发现现实生活中的代码中使用了许多语言扩展。作为初学者,我应该学会使用它们,还是不惜一切代价避免使用它们?我看到它破坏了与Haskell 98的兼容性并将代码限制为仅GHC。但是,如果我在Hackage上浏览软件包,则无论如何我都会看到其中大多数都是纯GHC的。

那么,社区对于使用语言扩展的态度是什么?

如果可以使用扩展名,那么如何区分可以“安全”使用的扩展名(那些可能成为下一个Haskell标准的一部分)和大多数“实验性”扩展名呢?例如,我假设-XDisambiguateRecordFields很好并且有用,但是将来可能会支持它吗?


我个人并不担心这种兼容性。GHC如此之好,以至于成为主流-即使对于只是拒绝遵守主流的人(Haskellers)。
MasterMastic

Answers:


70

有一些GHC扩展太好了,不能没有。我最喜欢的是

  • 多参数类型类
  • 范围类型变量
  • 更高等级的类型
  • 广义代数数据类型(GADT)

其中真正必要的是多参数类型类。

一些GHC扩展名非常具有推测性和实验性,您可能需要谨慎使用。确定稳定可靠的扩展的一种好方法是查看是否计划将其包含在Haskell Prime中,希望它可以作为Haskell 98的后继产品。

我第二点是唐·斯图尔特(Don Stewart)的建议,即应该使用LANGUAGE源文件中的编译指示标记每个扩展名。 不要使用命令行选项启用扩展。


2
谢谢!我将避免使用命令行选项来启用扩展。
萨斯坦宁

51

是的,请适当使用扩展名。

但是请确保有意启用它们-仅在您决定需要它们时才启用。通过{-# LANGUAGE Rank2Types #-}(例如)按模块进行此操作。


19

通常来说,人们确实会大量使用GHC扩展,因为它们是如此有用,而Haskell 98已经很老了。一旦有了最新的标准,人们可能会更加努力地坚持下去。

您可以在此处找到下一个标准的提案状态。


感谢您的回答和链接。我想应该避免被拒绝的提议。
sastanin

好吧,拒绝的原因可能有很多种,因此,如果您真的想使用某些东西,请深入研究细节。但这是一个很好的经验法则。
GS-向Monica致谢,2009年

5

这里的其他答案是好的。我要补充一点,GHC扩展不像将来那样容易受到将来的威胁(*),因为GHC似乎已经成为最流行的Haskell编译器,并且我认为这种变化不会很快改变。

(*)与“面向未来”相反

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.