2014-11-01 2 views
0

Я пытаюсь собрать рекурсивную функцию, которая подсчитывает количество четных элементов в списке, и до сих пор это то, что я придумал, но, очевидно, для тех, кто имеет опыт в этом язык будет иметь возможность видеть то, что проблема есть, и сообщение об ошибке не приходит до после ввода ввода списка, и я понятия не имею, что его со ссылкой, любая помощь будет оцененаhaskell counting Even numbers В списке

evenNumCount [] = [] 
evenNumCount (x:xs) 
    | ev == True = 1 + (evenNumCount xs) 
    | otherwise  = evenNumCount xs 
    where ev = even x 
+0

(вы можете заменить '| ev == True = 1 + (evenNumCount xs), где ev = четный x' с просто '| даже x = 1 + evenNumCount xs') – AndrewC

+2

Также вы можете сделать 'evenNumCount = length. фильтр даже ' – alternative

ответ

5

Ваш базовый случай должен :

evenNumCount [] = 0 

Если вы посмотрите на тип своего evenNumCount определение в GCHi, это

evenNumCount :: (Integral t, Num [a]) => [t] -> [a] 

, когда вы хотите быть

evenNumCount :: (Integral t, Num a) => [t] -> a 
+0

@ Abstract3000 .... или даже даже' evenNumCount :: [Int] -> Int'. Всегда предоставляйте подписи типов, это помогает вам соответствовать вашему коду с вашими ожиданиями. В этом случае строка '1 + (evenNumCount xs)' сработала бы, если бы вы могли рассматривать списки как числа, поэтому ограничение 'Num [a]' было. – AndrewC

+0

Извините, что захватил ваш ответ в качестве моего soapbox, мне было слишком лениво написать свой собственный. Имейте upvote путем согласия и извинения. – AndrewC

+0

Благодарим за отзыв, это было намного проще, чем я думал. Я просто изучаю этот язык, и у меня было грубое время с подписями типа и их полное понимание, теперь прочитайте эту главу 4X и медленно ее схватывайте, но я думаю, практика делает совершенным, я очень ценю советы и помощь :) – Abstract3000

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