数据记录的类约束

Mic*_*ard 2 haskell types

我有一个data类型:

data BuildException a = KillBuild JobID a Stage
                      | FailBuild JobID a Stage
                      | CancelBuild JobID a Stage
                      | StopBuild JobID a Stage
                         deriving Typeable
Run Code Online (Sandbox Code Playgroud)

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

dfl*_*str 5

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

makeException :: Foo a => String -> BuildException a
Run Code Online (Sandbox Code Playgroud)

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

  • 可以在容器库的几个部分中找到不在每个函数上添加约束的示例.以[Set](http://hackage.haskell.org/packages/archive/containers/latest/doc/html/Data-Set.html)为例,为了实现它需要`Ord`约束元素.虽然各种函数不需要这样的约束,但是你可以创建一个空的单个元素集,而几个'process all elements'函数也不需要它. (2认同)