【问题标题】:Should I use new Haskell language extensions in favour of the old ones?我应该使用新的 Haskell 语言扩展来支持旧的吗?
【发布时间】:2012-11-05 12:48:39
【问题描述】:

当开始一个新的 Haskell 项目时,该项目需要新旧扩展提供的语言特性,我应该使用哪个?新的还是旧的?例如:

我倾向于较新的,因为它们感觉更干净,并且以统一的方式为语言添加了更多功能。但是,较旧的编译器得到更多编译器的支持,它们在现有库中使用,并且可能在程序员中更为人所知。

更新: 如答案/cmets 中所述,上述“取代”关系并不完全准确。但是,我对(经常发生的)一个任务可以通过几个扩展同样好地完成的情况感兴趣。

【问题讨论】:

  • 如果我错了,请纠正我,但 TypeFamilies 并没有完全取代 FunctionalDependencies(FD 允许重叠实例,因此递归)
  • @maxtaldykin 类型族可以有重叠的实例和递归。确实,它们不会取代功能依赖。但是原因很微妙。 this paper 的最后讨论了一点,但几乎是即兴评论,我不记得看到任何其他真实的例子试图制作一小段(可理解的=)代码可以'不能相互编码。
  • 我担心这个问题并不能真正客观地回答......
  • @DanielWagner,TF 对重叠的支持有点有限,例如不可能同时拥有instance F ainstance F (a->b)
  • 我担心这个问题的最后一段已经回答了这个问题

标签: haskell functional-programming language-features


【解决方案1】:

“取代”在这里非常含糊。

对于语义与其他特征重叠的语言特征,我们可以识别几种情况:

  • 一些特征概括了现有特征
  • 有些提供替代方法

对于更一般的功能,有风险也有好处。通用性会影响语言的许多其他部分,或受到限制。在后者中,选择一般情况。

如果是在没有严格排序的替代方法之间进行选择,例如 FD 或 AT,则很难给出一般性建议。

因此,总而言之,“不”,就语言特性而言,没有明显的理由使用“新”事物而不是“旧”事物。他们不是这样排序的。

【讨论】:

  • 我担心任务可以通过多个扩展来完成并且没有扩展比其他扩展提供显着优势的情况。 (我也会将其添加到问题中。)
【解决方案2】:

简而言之,是的,并且出于您所说的原因:更清晰,更清晰。

有时我会遇到一个类更好地表示为具有功能依赖的多参数类型类的地方,因为这样可以更简单地获得更多参数,但通常关联类型族是一种更清晰、更灵活的方式压制它。对于函数式程序员来说,类型族比函数式依赖更直观。

GADT 的语法比存在量化更清晰、更清晰,概念障碍更少,而且很容易得到你想要的行为。

如果可以的话,我建议使用新的东西,如果需要的话,使用旧的方法。这些可爱的新扩展可以做更高的配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多