2009-04-29 87 views
75

在我学习Haskell时,我发现在现实生活中使用了很多language extensions代码。作为初学者,我应该学会使用它们,还是应该不惜一切代价避免它们?我发现它打破了与Haskell的兼容性,仅将代码限制在几乎GHC。但是,如果我在Hackage上浏览软件包,我发现它们中的大多数只有GHC。我应该使用GHC Haskell扩展吗?

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

如果扩展的使用是可以的,那么我怎样才能区分我可以“安全”使用的扩展(可能成为下一个Haskell标准的一部分)呢?例如,我想-XDisambiguateRecordFields很好,很有用,但未来可能会得到支持吗?

+0

我个人并不担心这个兼容性; GHC非常好,它是主流 - 即使对于那些拒绝遵从主流(Haskellers)的人也是如此。 – MasterMastic 2015-08-08 08:08:55

回答

69

有一些GHC扩展太好,没有生活。在我最喜欢的是

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

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

一些GHC扩展是非常具有推测性和实验性的,您可能需要谨慎使用。确定一个稳定和可信任的扩展的一个好方法是看看它是否被纳入Haskell Prime,这是希望成为Haskell 98的后继者。

我第二个唐斯图尔特的建议,每个扩展应标记使用源文件中的LANGUAGE编译指示。 不要使用命令行选项启用扩展。

19

一般而言,人们确实会使用GHC扩展,因为它们非常有用,Haskell 98也很老旧。一旦有更新的标准,人们可能会更加努力地坚持下去。

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

+0

谢谢你的答案和链接。我认为应该避免被拒绝的提案。 – sastanin 2009-04-29 15:19:50

+0

那么,可能会有相当多的拒绝原因,所以如果你真的想用一些东西挖掘一些细节。但这是一个很好的经验法则。 – 2009-04-29 15:48:19

51

是的,根据需要使用扩展名。

但一定要启用它们故意 - 只有当你决定你需要它们时。 通过{-# LANGUAGE Rank2Types #-}(例如)以模块为单位执行此操作。

4

这里的其他答案是很好的。我想补充一点,GHC扩展并不像未来那样容易受到攻击(*),因为GHC似乎是遥遥领先的Haskell编译器,而且我也没有看到即将发生的变化。

(*)作为“面向未来”的相反