[英]Why does a Haskell type "deriving Integral" need to be "deriving Enum"?
我最近一直在嘗試“學習 Haskell”,我想創建一個新類型來表示 integer state,而不僅僅是使用原始 Integer(為了類型安全和代碼清晰)。 具體來說,編譯以下代碼:
newtype AuxState = AuxState Integer
deriving (Eq, Ord, Num, Integral, Real, Enum)
但是,由於我的應用程序中有無數個狀態,所以我沒有興趣將這個 state 轉換為枚舉。 但是,如果我嘗試刪除deriving (Enum)
語句,使其只是deriving (Eq, Ord, Num, Integral, Real)
,編譯器會抱怨:
No instance for (Enum AuxState)
arising from the 'deriving' clause of a data type declaration
Possible fix:
add an instance declaration for (Enum AuxState)
or use a standalone 'deriving instance' declaration,
so you can specify the instance context yourself
When deriving the instance for (Integral AuxState)
我發現很難相信 Haskell 會強制 Integral class 中的類型也出現在 Enum class 中; 不應該反過來嗎? 這是有原因的,還是我做錯了/理解錯了什么?
所有Integral
都必然是Enum
,因為Integral
數學的基礎是succ
和pred
操作。 (從技術上講, Enum
代表一個適當的類型層次結構,其中Integral
類型是數學半群,我認為。)反過來似乎更錯誤:你的意思是每個Enum
都應該是Integral
? 這是否包括像這樣的隨機 ADT
data Foo = A | B | C | D | E | F | G deriving (Enum)
?
(當然,每個Enum
都應該同構於Integral
的一個子集,但這實際上表明它朝另一個方向發展: Integral
可以表示任何Enum
,但反之亦然,因此Integral
是一種 ur- Enum
。)
技術上的原因是因為Integral
在Prelude
中是這樣定義的:
class (Real a, Enum a) => Integral a where
...
數學原因是每個整數類型都是可枚舉的,但反之則不然。 以有理數為例。 請注意,枚舉並不意味着有限枚舉,如Integer
所示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.