2

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

4

2 回答 2

5

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

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

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

于 2012-07-20T19:48:48.053 回答
1

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

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

于 2012-07-21T15:07:57.853 回答