【问题标题】:Class constraints for data records数据记录的类约束
【发布时间】:2012-07-21 23:07:57
【问题描述】:

我有一个data 类型:

data BuildException a = KillBuild JobID a Stage
                      | FailBuild JobID a Stage
                      | CancelBuild JobID a Stage
                      | StopBuild JobID a Stage
                         deriving Typeable

其中 a 必须有类 Foo 的实例。我记得读过(也许在 RWH 中) 虽然data 定义中可能有类约束,但这是不可取的。 那么这样做的正确方法是什么?

【问题讨论】:

  • 附带说明,您可能希望将此类型一分为二:data Reason = Kill | Fail | Cancel | Stop; data BuildException a = BuildException Reason JobID a Stage
  • @DanielWagner 没错。

标签: haskell types


【解决方案1】:

只需将类型约束应用于需要它的函数。例如:

makeException :: Foo a => String -> BuildException a

甚至可能有一些函数不需要Foo 约束,这可能使您的API 的客户端可以使用它的子集而无需定义Foo 约束!如果它是数据记录定义的一部分,这是不可能的。

【讨论】:

  • 在容器库的几个部分中可以找到不为每个函数添加约束的示例。以Set 为例,它的实现需要Ord 约束元素。尽管各种函数不需要这种约束,但您可以创建一个空的单个元素集,而无需它,并且几个“处理所有元素”函数也不需要它。
【解决方案2】:

你没看错。然而,在 Haskell 2010 中,这个特性被删除了,因为它没有用。您可以在数据类型中指定约束,但所有函数也必须具有相同的约束,因此实际上没有意义。因此,该功能被删除,因为它完全没用。

如前所述,您应该只在函数中指定约束。但是,您应该意识到您不需要为不需要它的函数指定约束。特别是,如果没有必要,创建函数不一定需要受限于约束,因为像这样的无限函数是约束版本的泛化。这适用于将其作为参数的函数,但这样的函数更有可能实际需要约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2014-12-15
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多