簡體   English   中英

為什么 Haskell 類型的“派生積分”需要“派生枚舉”?

[英]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數學的基礎是succpred操作。 (從技術上講, Enum代表一個適當的類型層次結構,其中Integral類型是數學半群,我認為。)反過來似乎更錯誤:你的意思是每個Enum都應該是Integral 這是否包括像這樣的隨機 ADT

data Foo = A | B | C | D | E | F | G deriving (Enum)

(當然,每個Enum都應該同構於Integral的一個子集,但這實際上表明它朝另一個方向發展: Integral可以表示任何Enum ,但反之亦然,因此Integral是一種 ur- Enum 。)

技術上的原因是因為IntegralPrelude中是這樣定義的:

class (Real a, Enum a) => Integral a where
   ...

數學原因是每個整數類型都是可枚舉的,但反之則不然。 以有理數為例。 請注意,枚舉並不意味着有限枚舉,如Integer所示。

暫無
暫無

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

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