我应该使用GHC Haskell扩展吗?

时间:2009-04-29 10:39:15

标签: haskell ghc

当我正在学习Haskell时,我发现在现实生活中的代码中使用了很多language extensions。作为初学者,我应该学会使用它们,还是应该不惜一切代价避免使用它们?我看到它破坏了与Haskell 98的兼容性,并且仅将代码限制为几乎GHC。但是,如果我在Hackage上浏览软件包,我发现大多数软件包都是GHC版本。

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

如果扩展的使用是正常的,那么如何区分我可以“安全地”使用的扩展(那些可能成为下一个Haskell标准的一部分的扩展)与那些主要是“实验性”的扩展?例如,我认为-XDisambiguateRecordFields很好用,但未来很可能会得到支持吗?

4 个答案:

答案 0 :(得分:71)

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

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

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

某些GHC扩展非常具有推测性和实验性,您可能需要谨慎使用。识别稳定且可信的扩展的一种好方法是查看它是否包含在Haskell Prime中,希望它是Haskell 98的后继者。

我的第二个Don Stewart的建议是,应该使用源文件中的LANGUAGE pragma标记每个扩展名。 不要使用命令行选项启用扩展。

答案 1 :(得分:51)

是的,请根据需要使用扩展程序。

但请确保只在您决定需要时才启用 。 通过{-# LANGUAGE Rank2Types #-}(例如)在每个模块的基础上执行此操作。

答案 2 :(得分:19)

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

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

答案 3 :(得分:4)

这里的其他答案都很好。我想补充一点,GHC扩展并不像它们可能的那样具有未来的脆弱性(*),因为GHC似乎是最流行的Haskell编译器,我不认为它会很快发生变化。

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