【问题标题】:Typeclass constraints on data declarations数据声明的类型类约束
【发布时间】:2012-09-28 00:40:26
【问题描述】:

显然,在数据声明 [src][src] 上放置类型类约束是个坏主意。

我个人并没有遇到过在我创建的数据类型中限制类型的愿望,但对我来说,为什么语言设计者“认为允许这是一个坏主意”对我来说并不明显。这是为什么呢?

【问题讨论】:

    标签: haskell types typeclass


    【解决方案1】:

    我个人并没有遇到过在我创建的数据类型中限制类型的愿望,但对我来说,为什么语言设计者“认为允许这是一个坏主意”对我来说并不明显。这是为什么呢?

    因为它具有误导性,并且与实际有用的东西完全相反。

    特别是,它实际上并没有以您可能期望的方式限制数据类型中的类型。它所做的 所做的只是对数据构造函数本身 施加类约束,这意味着您需要在构造值时满足实例......但仅此而已。

    因此,例如,您不能简单地定义具有Ord 约束的二叉搜索树,然后知道任何树都有可排序的元素;查找和插入函数本身仍然需要Ord 约束。您所要阻止的只是构建一个“包含”某些无序类型的值的空树。就模式匹配而言,对包含的类型完全没有约束。

    另一方面,Haskell 的工作人员并不认为明智的版本(人们倾向于假设提供的数据类型上下文)是一个坏主意!事实上,对数据类型 declared with GADT syntax(广义代数数据类型,在 GHC 中使用 GADTs 语言编译指示启用)的类约束以明显的方式起作用——您需要一个约束来构造值,并且有问题的实例也存储在 GADT 中,因此您不需要约束来处理值,并且 GADT 构造函数上的模式匹配允许您使用它捕获的实例。

    【讨论】:

    • 也许wiki page 链接到的 OP 需要更新以提及 GADT。它建议将 MultiParamTypeClasses 作为一种解决方法!哎呀!
    【解决方案2】:

    在 数据类型 - 它非常有用,并且不会破坏您的其他代码。

    坏处在于人们经常期望他们可以做到 使用数据类型让他们免于对函数施加约束 使用数据类型,但事实并非如此。 (你可以争辩说隐式约束会导致问题。)

    对数据类型施加约束实际上是对所有构造函数施加约束 提到约束类型。 就像带有约束的普通函数一样,如果你使用构造函数, 您必须添加约束。我认为这是健康且光明正大的。

    确实确保您不能将数据放入您的数据类型中,除非您可以这样做 某些东西。它很有用。您不会创建程序 使用一个失礼,这不是坏习惯,它只是没有那么可爱 他们想要。

    “允许的坏主意”可能是因为 GADT 确实是他们想要的。
    如果 GADT 最早出现,他们就不会这样做。

    我认为两者兼而有之并不是一件坏事。如果你想要一个状态 操作函数,您可以使用您传递的永久显式参数, 或者您可以使用 monad 并使其隐含。如果你想限制 您可以在数据声明中使用永久显式数据或隐式数据 与 GADT。 GADTs 和 monads 更复杂,但它并没有 显式参数或数据类型约束错误。

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 2019-03-21
      • 2016-04-09
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多