Я думаю, что это больше семантическая дискуссия.Ваш код работает нормально, если мы предположим, что диапазоны исключительные Но ваш пример предполагает, что границы включительно , поэтому мы можем переписать это следующим образом:
countRange :: Int -> Int -> [Int] -> Int
countRange _ _ [] = 0
countRange low high (x:xs) | low <b><=</b> x && high <b>>=</b> x = 1 + countRange low high xs
| otherwise = countRange low high xs
Но я думаю, что вы делаете это слишком сложно здесь.Вы можете посчитать количество элементов в списке с помощью length
, а мы можем отфильтровать элементы с помощью filter
, поэтому мы можем записать его в компактной форме с помощью:
countRange :: Int -> Int -> [Int] -> Int
countRange low hig = length . filter f
where f x = x >= low && x <= hig
Обратите внимание, что мы можемобобщить сигнатуру функции без каких-либо дополнительных усилий:
countRange :: <b>Ord a => a -> a -> [a] -> Int</b>
countRange low hig = length . filter f
where f x = x >= low && x <= hig