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