簡體   English   中英

為什么Sum和Product沒有Enum實例?

[英]Why isn't there an Enum instance for Sum and Product?

如果你導入Data.Monoid ,你會發現SumProductAllAny沒有Enum實例,即使BoolIntegral實例也有。 提供一個實例,例如, Enum a => Enum (Sum a)不是有意義? 不這樣做的理論原因是什么? 我也很欣賞這背后深入理論的鏈接。

提供這些實例不是很有意義嗎? 不是很多。 這些newtypes的目的是你可以在想要處理泛型Monoid實例的函數中使用具體的數字類型。 這個想法是,你在newtype構造函數中包裝參數,應用Monoid -polymorphic函數(它不知道它只是處理包裝的數字),並立即再次打開結果。 你不用SumProductAny等值做任何其他事情,因此你也不需要Enum實例。

可能需要它的唯一原因是函數是否有約束(Monoid a, Enum a) => ... 但這是一個不太可能的組合Monoid是一個普通的,高級的,“代數”類,而Enum是一個相當低級,特定的集合類。 如果你需要Enum這意味着你或多或少只會處理一系列的Int ,並將你自己的意思歸結為“零元素”和“元素組合”,那你為什么還需要Monoid呢?

但是,如果您發現自己處於這種情況,您可以在本地定義一個新類型,並准確地為您提供所需的實例。 在某些時候,這種特殊方法比預先為每種可能的約束組合定義標准實例更有效,在大多數情況下,沒有人會需要。

我同意@chi有人忘了。 我不能想到它不應該存在的充分理由,這是足夠的理由(人們很可能在他們的應用程序代碼中定義孤立實例,這會導致悲傷)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM