[英]Why isn't there an Enum instance for Sum and Product?
如果你導入Data.Monoid
,你會發現Sum
, Product
, All
, Any
沒有Enum
實例,即使Bool
和Integral
實例也有。 提供一個實例,例如, Enum a => Enum (Sum a)
不是有意義? 不這樣做的理論原因是什么? 我也很欣賞這背后深入理論的鏈接。
提供這些實例不是很有意義嗎? 不是很多。 這些newtypes的目的是你可以在想要處理泛型Monoid
實例的函數中使用具體的數字類型。 這個想法是,你在newtype構造函數中包裝參數,應用Monoid
-polymorphic函數(它不知道它只是處理包裝的數字),並立即再次打開結果。 你不用Sum
, Product
, Any
等值做任何其他事情,因此你也不需要Enum
實例。
你可能需要它的唯一原因是函數是否有約束(Monoid a, Enum a) => ...
但這是一個不太可能的組合Monoid
是一個普通的,高級的,“代數”類,而Enum
是一個相當低級,特定的集合類。 如果你需要Enum
這意味着你或多或少只會處理一系列的Int
,並將你自己的意思歸結為“零元素”和“元素組合”,那你為什么還需要Monoid
呢?
但是,如果您發現自己處於這種情況,您可以在本地定義一個新類型,並准確地為您提供所需的實例。 在某些時候,這種特殊方法比預先為每種可能的約束組合定義標准實例更有效,在大多數情況下,沒有人會需要。
我同意@chi有人忘了。 我不能想到它不應該存在的充分理由,這是足夠的理由(人們很可能在他們的應用程序代碼中定義孤立實例,這會導致悲傷)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.