2015-10-22 16 views
1

Я простая функция, определенные ниже:Haskell - перегрузка числовых типов

allZero :: Num a => [a]-> Bool 
allZero [] = False 
allZero xs = and (map (== 0) xs) 

Это возвращает сообщение об ошибке при загрузке:

Не удался вывести (Num а), возникающих из буквального ` 0 '

В чем проблема с этой функцией? Как увеличить число 0 до любого числового типа a?

+1

Поскольку место 'Num' в иерархии классов типов изменилось (некоторое время назад), возможно, стоит указать, какую версию GHC вы используете. – Jubobs

+3

Кстати, я бы ожидал, что 'allZero []' вернет true. Вы также можете использовать 'all (== 0) xs' вместо' and (map (== 0) xs) '. – chi

ответ

7

Этот код компилируется после добавления ограничения Eq a на номер allZero. Не должно быть никаких других проблем с компиляцией этого кода.

allZero :: (Num a, Eq a) => [a]-> Bool 
allZero [] = False 
allZero xs = and (map (== 0) xs) 

Поскольку некоторые комментаторы указали, первый случай не является стандартным, как allZero из [] обычно True. С этим определением первый случай становится излишним.

+0

Кажется, что я учился на устаревшей книге, спасибо! – Raven

Смежные вопросы