まず第一に、これは通常のリスト インスタンスとまったく同じようには機能しません。通常のインスタンスは、リストのアイテム自体が順序付け可能であることにのみ依存します。あなたの提案は、それらの数(Numクラス内など)に依存するため、より狭いものになります。
新しいsum関数を定義する必要があります。sum幸いなことに、単純な再帰関数として書くのはとても簡単です。(偶然にも、関数 を呼び出すことができます。sum'これは「サム プライム」と発音され、慣例により、 に非常によく似た関数であることを意味しsumます。)
Numさらに、インスタンスはクラスだけでなくクラスにも依存する必要がありますOrd。
新しいsum関数を作成したら、次のようにインスタンスを定義できます。
instance (Ord n, Num n) => Ord (List n) where compare = ...
-- The definition uses sum'
このインスタンス ステートメントは、すべての型nについて、 if nis inOrdおよびNum、List nis in Ordwhere 比較が次のように機能することを示していると読むことができます。構文は数学に非常に似ていますが、ここで=>は含意です。これにより、構文を覚えやすくなることを願っています。
の合理的な定義を与える必要がありcompareます。参考までに、compare a b次のように動作しa < bます。LTa = bEQa > bGT
これは実装が簡単な関数なので、読者の演習として残します。(私はいつもそれを言いたかった:P)。