是否可以编写类似以下内容的内容:
data SomeData = SomeValue | (Integral a) => SomeConstructor a
又怎么会这样写呢?
最佳答案
这类似于Daniel Pratt的回答,但是更典型的方法是在数据定义上放弃类型约束,如下所示:
data SomeData a = SomeValue
| SomeConstructor a
相反,您应该将
(Integral a)
约束放在所有需要它的函数上,即使您也将该约束添加到数据定义中,也必须这样做。将约束放在数据定义上并不会给您带来任何好处,但会迫使您在所有SomeData
用途(即使根本不在乎a
是什么的用途)上都施加约束。有关更多信息,请参见Chapter 10 of Real World Haskell。