78

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

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

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

4

4 回答 4

70

有一些 GHC 扩展非常好,没有它就无法生存。我最喜欢的是

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

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

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

我赞同 Don Stewart 的建议,即每个扩展都应使用LANGUAGE源文件中的编译指示进行标记。 不要使用命令行选项启用扩展。

于 2009-04-29T23:07:52.087 回答
51

是的,酌情使用扩展。

但一定要有意启用它们——仅当您决定需要它们时。{-# LANGUAGE Rank2Types #-}通过(例如)在每个模块的基础上执行此操作。

于 2009-04-29T16:13:24.003 回答
19

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

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

于 2009-04-29T12:39:25.797 回答
5

这里的其他答案很好。我要补充一点,GHC 扩展并不像它们可能的那样容易受到未来攻击(*),因为 GHC 似乎是最流行的 Haskell 编译器,而且我认为这种情况不会很快改变。

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

于 2013-05-02T18:31:34.283 回答