Я постараюсь объяснить ошибку и решение. Решение должно быть:
allZero :: [Int] -> Bool
allZero [] = True
allZero (x:xs) = (x == 0) && (allZero xs)
Подумайте о двух шаблонах. Во-первых, если элементов нет, все равны 0, что имеет смысл, то есть первый шаблон []
. Во втором шаблоне вы спрашиваете, является ли первый 0
, и говорите, что значение &&
, все остальные элементы должны быть 0
(с использованием рекурсии)
В вашем примере:
allZero :: [Int] -> Bool
allZero (0:_) = True --Wrong, here you are saying if it start with 0, True, no matter what is next, and that's not correct
allZero (0:s) = 0 : allZero s -- this could be right along side with other patterns
allZero (_:s) = False -- this is wrong by sure, you are saying if a list has at list one element, False
allZero _ = False -- And this one has no sense among the others
У вас много шаблонов и неверных. Вы можете изменить мой первый ответ как эквивалент:
allZero :: [Int] -> Bool
allZero [] = True
allZero (0:xs) = (allZero xs)
allZero _ = False