Прежде всего, это не будет работать так же, как нормальный экземпляр списка. Обычный экземпляр зависит только от того, какие элементы списка сами заказываются; ваше предложение зависит от их номеров (например, в классе 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).
отличный ответ, я бы upvote, если бы я мог ... Haskell удивительно интуитивным, как только у вас есть ответ перед вами – cdk