6

Ordのインスタンス宣言について疑問に思っていたので、ハッキングをすばやく検索して、比較が最初に行われ、次に等しい場合はで(a,b)行われるという直感を確認したいと思いました。具体的にはここに行きました。ハッキングにはデータ宣言や関数のソースコードへのリンクがあるので、インスタンス宣言のソースコードもあると思いましたが、見つかりません。彼らがそこにいない理由はありますか、それとも私は十分に一生懸命に見えなかったのですか?:)abtype Answer = Either Explanation Directions

4

3 に答える 3

4

Haskell 98 レポートでは、セクション 10.1 でこれを指定しています。

Eq および Ord の派生インスタンスによって自動的に導入されるクラス メソッドは、(==)、(/=)、compare、(<)、(<=)、(>)、(>=)、max、および min です。後者の 7 つの演算子は、指定されたコンストラクター セットに関して辞書式に引数を比較するように定義されており、データ型宣言の前のコンストラクターは後のコンストラクターよりも小さいものとしてカウントされます。

派生比較は、常にコンストラクターを左から右にトラバースします。

...

クラス Eq および Ord のすべての派生操作は、両方の引数で正格です。

于 2012-05-02T13:52:04.243 に答える
4

タプルのOrdインスタンスは、 Gofer までさかのぼる言語仕様の規則に従って、派生しています。

instance (Eq a, Eq b) => Eq (a,b) where
    (x,y) == (u,v)  =  x==u && y==v

instance (Ord a, Ord b) => Ord (a,b) where
    (x,y) <= (u,v)  = x<u  ||  (x==u && y<=v)
于 2012-05-02T13:03:44.087 に答える
4

Prelude を調べてtypeclassのソース リンクをOrdクリックし、少し下にスクロールしたところ、次のように定義されていることがわかりました。

deriving instance (Ord a, Ord b) => Ord (a, b)

StandaloneDeriving拡張機能を使用しています。基本的に、型が次のように定義されている場合と同じコードを生成しています

data (a, b) = (a, b) deriving Ord
于 2012-05-02T12:56:59.340 に答える