Подсчитайте числа в заданном диапазоне низких и высоких частот, используя Haskell - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь подсчитать, сколько чисел во входном списке находятся в заданном диапазоне низких и высоких частот.

Вот что у меня есть:

countRange :: Int -> Int -> [Int] -> Int
countRange  _ _ [] = 0
countRange low high (x:xs)  | (low < x) && (high > x) = 1 + (countRange low high xs)
                            | otherwise = countRange low high xs

Некоторые примеры:

  • countRange 5 8 [] ==> 0
  • countRange 1 3 [1,2,3,4,5] ==> 3

1 Ответ

0 голосов
/ 10 мая 2018

Я думаю, что это больше семантическая дискуссия.Ваш код работает нормально, если мы предположим, что диапазоны исключительные Но ваш пример предполагает, что границы включительно , поэтому мы можем переписать это следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...