计算嵌套列表中大于和小于特定值的值的数量
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))
我正在研究一个家庭作业问题的函数,该函数计算列表中值大于 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))