为什么不存在Sum和Product的Enum实例?

时间:2017-03-28 09:34:09

标签: haskell typeclass

如果您导入Data.Monoid,则会发现SumProductAllAny没有http://javadoc.jenkins-ci.org/jenkins/model/Jenkins.html {{3}} 1}}实例,即使EnumBool的实例也是如此。提供一个实例,例如Integral,是不是有意义?不这样做的理论原因是什么?我也很欣赏这背后深入理论的链接。

2 个答案:

答案 0 :(得分:2)

提供这些实例不是很有意义吗?不是很多。这些newtypes的目的是你可以在想要处理泛型Monoid实例的函数中使用具体的数字类型。这个想法是,你将参数包装在newtype构造函数中,应用Monoid - 多态函数(它不知道它只是处理包装的数字),并立即再次打开结果。您不会对SumProductAny等值执行任何其他操作,因此您也不需要Enum个实例。

可能需要它的唯一原因是函数是否具有约束(Monoid a, Enum a) => ...。但这是一个不太可能的组合 - Monoid是一个通用的,高级的“代数”类,而Enum是一个相当低级,特定的集合类。如果你需要Enum,这意味着你会或多或少地处理一系列Int s,并将你自己的意思归结为“零元素”和“元素组合”,那你为什么要这样做?还需要Monoid

但是,如果您发现自己处于这种情况,您可以在本地定义一个新类型,并准确地为您提供所需的实例。在某些时候,这种特殊方法比先发制人地定义对类型的约束的每个可能的组合的标准实例更有效,在大多数情况下,没有人会需要。

答案 1 :(得分:1)

我同意@chi有人忘了。我不能想到它不应该存在的充分理由,这是足够的理由(人们很可能在他们的应用程序代码中定义孤立实例,这会导致悲伤)。