我有一个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
定义中可能有类约束,但这是不可取的。
那么这样做的正确方法是什么?
答案 0 :(得分:5)
只需对需要它的函数应用类型约束。例如:
makeException :: Foo a => String -> BuildException a
甚至可能有一些函数不需要Foo
约束,这可能使API的客户端可以使用它的子集而无需定义Foo
约束!如果它是数据记录定义的一部分,那是不可能的。
答案 1 :(得分:1)
你读得正确。但是,在Haskell 2010中,此功能已被删除,因为它没用。你可以在数据类型中指定约束,但是所有函数也必须具有相同的约束,所以实际上没有任何意义。因此,该功能被删除,因为它完全没用。
如上所述,您应该只在函数中指定约束。但是,您应该意识到不需要为不需要它的函数指定约束。特别地,如果不必要,创建函数不一定需要限于约束,因为像这样的无限函数是约束版本的推广。这适用于将其作为参数的函数,但是这样的函数实际上更可能需要约束。