5

私は最近「Haskellを学ぼう」と試みていますが、(型の安全性とコードの明確さのために)生の整数を使用せずに、整数状態を表す新しい型を作成したいと思います。具体的には、次のコードがコンパイルされます。

newtype AuxState = AuxState Integer
  deriving (Eq, Ord, Num, Integral, Real, Enum)

ただし、アプリケーションには無限の数の状態があるため、この状態を列挙型に変換することに関心はありません。ただし、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クラスの型をEnumクラスにも強制的に含めるとは信じがたいです。逆にすべきではありませんか?これには理由がありますか、それとも私は何か間違ったことをしている/理解していますか?

4

2 に答える 2

8

すべてIntegralは必然的に数学Enumの基礎がと操作であるためです。(技術的には、型が数学的な半群である適切な型階層の代わりになっていると思います。)逆の場合はさらに間違っているように見えます。これには、次のようなランダムなADTが含まれますかIntegralsuccpredEnumIntegralEnumIntegral

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

(確かに、すべてEnumがのサブセットと同型である必要がありますが、それはIntegral実際には反対方向に進んでいることを示唆してい ます。IntegralEnumIntegralEnum

于 2012-04-11T04:37:26.313 に答える
6

技術的な理由は、次のようIntegralに定義されPreludeています。

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

数学的な理由は、すべての整数型は列挙可能ですが、その逆ではないためです。たとえば、有理数について考えてみましょう。によって示されるように、Enum は有限列挙を意味しないことに注意してくださいInteger

于 2012-04-11T05:54:45.110 に答える