Зачем добавлять ограничение типа "Eq" без использования "=="? - программирование
Подтвердить что ты не робот

Зачем добавлять ограничение типа "Eq" без использования "=="?

Итак, у меня есть очень простая функция, которая принимает два параметра: первый - это час (между 0 и 23), а второй - минута (между 0 и 59). Эта функция возвращает час плюс одна минута и форматирует час в красивом стиле. Например, hour 11 12 return 11 heures et 13 minutes. Извините за французский формат часа.

Итак, я использую в этой функции функцию show, а параметры должны быть числом, поэтому у меня есть объявление типа (Num a, Show a) => a -> a -> String. Но, когда я пытаюсь выполнить эту функцию, у меня появилась ошибка, и GHC сказал мне добавить ограничение типа Eq, но я не понимаю, зачем мне нужно ограничение типа Eq в этом случае. Есть код (опять же, извините за французский текст, используемый в функции, но я думаю, что это не очень важно, если вы не понимаете имя функции и текст):

heure :: (Num a, Eq a, Show a) => a -> a -> String
heure 23 59 = "Minuit"
heure 12 m  = "Midi et " ++ show (m+1) ++ " minutes"
heure h 59  = show (h+1) ++ " heures"
heure h m   = show h ++ " heures et " ++ show (m+1) ++ " minutes"

Итак: если я не использую Eq, у меня есть ошибка, и когда я его использую, мой код верен. Почему?

Спасибо за ваши объяснения!

4b9b3361

Ответ 1

Вам нужно ограничение Eq, потому что вы проверяете, равен ли h 23 или 12, и <<24 > равен 59. Вы делаете это с использованием сопоставления с образцом, а не ==, но сопоставление шаблонов с числовыми литералами по-прежнему требует Eq (в отличие от сопоставления шаблонов с конструкторами).