Во-первых, это не будет работать точно так же, как обычный экземпляр списка. Обычный экземпляр зависит только от того, что элементы списка сами заказываются; ваше предложение зависит от их числа (например, в классе Num
) и поэтому является более узким.
Необходимо определить новую sum
функцию. К счастью, очень легко написать sum
как простую рекурсивную функцию. (По совпадению, вы можете вызвать свою функцию sum'
, которая произносится как «сумма простых чисел» и по соглашению означает, что это функция, очень похожая на sum
.)
Кроме того, экземпляр должен зависеть как от класса Num
, так и от класса Ord
.
Когда у вас есть новая функция sum
, вы можете определить экземпляр примерно так:
instance (Ord n, Num n) => Ord (List n) where compare = ...
-- The definition uses sum'
Этот оператор экземпляра может быть прочитан как говорящий, что для всех типов n
, если n
находится в Ord
и Num
, List n
находится в Ord
, где сравнения работают следующим образом. Синтаксис очень похож на математический, где =>
подразумевается. Надеюсь, это облегчит запоминание синтаксиса.
Вы должны дать разумное определение compare
. Для справки, compare a b
работает следующим образом: если a < b
, он возвращает LT
, если a = b
, он возвращает EQ
, а если a > b
, он возвращает GT
.
Эту функцию легко реализовать, поэтому я оставлю ее читателю в качестве упражнения. (Я всегда хотел сказать это: P).
person
Tikhon Jelvis
schedule
25.05.2012