私は最近、 "私にハスケルを学ぶ"ことを試みてきました。生のInteger(型の安全性とコードの明快さ)を使用せずに、整数型を表す新しい型を作成したいと思います。具体的には、次のコードはコンパイルされます。ただしHaskellタイプの「Integralを導出する」タイプが「Enumを導出」する必要があるのはなぜですか?
newtype AuxState = AuxState Integer
deriving (Eq, Ord, Num, Integral, Real, Enum)
、自分のアプリケーション内の状態の無限の数があるので、私は列挙型には、この状態を変換するには関心を持っていません。私はそれだけでderiving (Eq, Ord, Num, Integral, Real)
ですのでderiving (Enum)
文を削除しようとする場合は、コンパイラは文句:
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
数学の基礎がsucc
とpred
操作であるため、
列挙型インスタンスは、順序付けられた型です。それらの値は列挙できます。 Enum型クラスの主な利点は、リスト範囲でその値を使用できることです。彼らはまた、後継者と前任者を定義しました。後者と前者は、succとpredfuctionsで得ることができます。私はすべての整数がこのクラスに属するべきだと信じています、どうしてあなたのものではないはずですか? –
"しかし、私のアプリケーションには無限の状態があるので..."あなたは「Enum」について間違って理解していると思います。 'Enum'は有限個の値を持つ型を意味するものではありません。 – newacct
"それ以外の方法ではいけませんか?" 'Double'は' Enum'ですが、明らかに 'Integral'ではありません – newacct