1

maxHaskell にはとのmin値をデータ型に関連付ける機能がありますが、理論的に無限の数 (1の最大値を加算するなどInteger) を期待どおりに処理できますか? Num型クラスがそれほど重要な理由は何ですか?

4

2 に答える 2

6

Haskell は、データ型のさまざまなプロパティを表現するための型クラスを提供します。

数値型

数値データ ( IntWordDoubleIntegerなど) を検討してください。これらの型はすべて、演算の概念的なグループを共有しています。加算、乗算、減算、否定などが可能です。これらのプロパティを共有する型は、型クラスのインスタンスにすることができますNum

制限された型

何らかの方法で制限されている型は、別の型クラスで表現されます: Bounded. デフォルトのモジュールのみがロードされた GHCI の私のシステムでは、 、、、およびBoundedのインスタンスが表示されます。機械語のサイズ、Unicode 標準の境界、およびそれらの宣言の制限によって制限されます。OrderingIntCharBoolIntCharBoolOrdering

Double は ではありませんBounded。無限を表現できるためです (したがって、概念的に無制限です)。IntegerまたBounded、上限は必ずしも決定可能でも一定でもない (使用可能なメモリによって制限される) ためではありません。それにもかかわらず、これらは両方とも数値型のプロパティを表現できるため、そうではNumありませんが、まだBoundedです。

オーバーフロー

オーバーフローに関しては、 はオーバーフローしIntegerないことが示されていますが、Int(WordメモリBounded内の固定幅表現による) 警告やエラーなしでオーバーフローします。私のシステムでは、1 + maxBound :: Int2 の補数が原因で minBound にオーバーフローしますが、これは保証された動作ではありません。Word符号なしのデータ型であるため、0 にオーバーフローします。

Bounded型が「予期される方法」でオーバーフローしない場合があることに注意してください。BoundedHaskell 仕様では、型がオーバーフローする方法を指定していないため、コンパイラの設計者に任されています。これらのデータ型の内部表現も指定されていないため、2 の補数を想定しないでください。実際、 an のサイズでさえInt29 ビットであることが保証されています。

于 2013-10-02T06:23:32.847 に答える
4

いくつかの種類の無関係な質問があります。

Integerつまり、任意のサイズの数値を処理できます (技術的には、基礎となるライブラリによって途方もなく巨大なもの (より正確には 2^(2^32)) に制限されており、問題はありません)。したがって、「最大」という概念はありませんInteger

Num足し算、引き算、絶対値などを持つことができるものはすべて であり、Numで動作するすべての関数で動作するため、型クラスは重要Numです。したがって、これらの操作のいずれかを使用する関数を作成する必要がある場合、それはすべてNumの s に対して機能します。つまり、Numすべての型クラスが重要なので、型クラスは重要です!

于 2013-10-02T04:50:56.113 に答える