数据记录的类约束

时间:2012-07-20 19:35:59

标签: haskell types

我有一个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定义中可能有类约束,但这是不可取的。 那么这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

你读得正确。但是,在Haskell 2010中,此功能已被删除,因为它没用。你可以在数据类型中指定约束,但是所有函数也必须具有相同的约束,所以实际上没有任何意义。因此,该功能被删除,因为它完全没用。

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