max
Haskell にはとのmin
値をデータ型に関連付ける機能がありますが、理論的に無限の数 (1
の最大値を加算するなどInteger
) を期待どおりに処理できますか? Num
型クラスがそれほど重要な理由は何ですか?
2 に答える
Haskell は、データ型のさまざまなプロパティを表現するための型クラスを提供します。
数値型
数値データ ( Int
、Word
、Double
、Integer
など) を検討してください。これらの型はすべて、演算の概念的なグループを共有しています。加算、乗算、減算、否定などが可能です。これらのプロパティを共有する型は、型クラスのインスタンスにすることができますNum
。
制限された型
何らかの方法で制限されている型は、別の型クラスで表現されます: Bounded
. デフォルトのモジュールのみがロードされた GHCI の私のシステムでは、 、、、およびBounded
のインスタンスが表示されます。機械語のサイズ、Unicode 標準の境界、およびそれらの宣言の制限によって制限されます。Ordering
Int
Char
Bool
Int
Char
Bool
Ordering
Double は ではありませんBounded
。無限を表現できるためです (したがって、概念的に無制限です)。Integer
またBounded
、上限は必ずしも決定可能でも一定でもない (使用可能なメモリによって制限される) ためではありません。それにもかかわらず、これらは両方とも数値型のプロパティを表現できるため、そうではNum
ありませんが、まだBounded
です。
オーバーフロー
オーバーフローに関しては、 はオーバーフローしInteger
ないことが示されていますが、Int
(Word
メモリBounded
内の固定幅表現による) 警告やエラーなしでオーバーフローします。私のシステムでは、1 + maxBound :: Int
2 の補数が原因で minBound にオーバーフローしますが、これは保証された動作ではありません。Word
符号なしのデータ型であるため、0 にオーバーフローします。
Bounded
型が「予期される方法」でオーバーフローしない場合があることに注意してください。Bounded
Haskell 仕様では、型がオーバーフローする方法を指定していないため、コンパイラの設計者に任されています。これらのデータ型の内部表現も指定されていないため、2 の補数を想定しないでください。実際、 an のサイズでさえInt
29 ビットであることが保証されています。
いくつかの種類の無関係な質問があります。
Integer
つまり、任意のサイズの数値を処理できます (技術的には、基礎となるライブラリによって途方もなく巨大なもの (より正確には 2^(2^32)) に制限されており、問題はありません)。したがって、「最大」という概念はありませんInteger
。
Num
足し算、引き算、絶対値などを持つことができるものはすべて であり、Num
で動作するすべての関数で動作するため、型クラスは重要Num
です。したがって、これらの操作のいずれかを使用する関数を作成する必要がある場合、それはすべてNum
の s に対して機能します。つまり、Num
すべての型クラスが重要なので、型クラスは重要です!