计算嵌套列表中大于和小于特定值的值的数量

Count the number of values in a nested list that are greater and less than certain values

我正在研究一个家庭作业问题的函数,该函数计算列表中值大于 v1 且小于 v2 的值的数量。我把一些有用的东西放在一起,但只在特定情况下有效。当我尝试其他操作时,我得到

的错误

*** Exception: Non-exhaustive patterns in function countInRange

此函数应该在 getInRange 上调用。 getInRange 只是列表中大于 v1 且小于 v2 的 returns 个值。这是它的样子。

rangeHelper v1 v2 x | x > v1 && x < v2 = True
                    | otherwise = False

getInRange :: Ord a => a -> a -> [a] -> [a]
getInRange v1 v2 iL = filter(rangeHelper v1 v2) iL

count iL = sum (map (const 1) iL)

countInRange :: Ord a => a -> a -> [[a]] -> Int
countInRange v1 v2 [iL] = count ((getInRange v1 v2) iL)

如果我打电话给

countInRange 3 10 [[4,5,6]]         -- works, prints 3
countInRange 3 10 [[1,2], [4,5,6]]  -- error: non exhaustive patterns

如果我们将您的函数简化为

countInRange v1 v2 [ iL ]  =  0

我们仍然会观察到相同的行为:

countInRange 3 10 [ [4,5,6]        ]   -- returns 0
countInRange 3 10 [ [1,2], [4,5,6] ]   -- ***Error: Non-exhaustive patterns

你能看出这里的问题吗?

您的 countInRange 函数只需要一个包含一个列表的列表。当你写 countInRange v1 v2 [iL] 时,当你的列表包含名为 iL 的单个元素时,你只将它定义为匹配模式。您也可以使用 count = length

您可以通过如下定义来解决此问题:

countInRange v1 v2 xs  = sum (map (length.filter (rangeHelper v1 v2)) xs)
-- or
countInRange v1 v2     = sum.map (length.filter (rangeHelper v1 v2))