计算嵌套列表中大于和小于某些值的值的数量

时间:2019-09-26 06:23:26

标签: list haskell nested runtime-error non-exhaustive-patterns

我正在处理一项针对家庭作业问题的函数,该函数计算列表中值大于v1但小于v2的值的数量。我整理了一些可行的方法,但仅在特定情况下适用。当我尝试其他事情时,我得到了错误

  

***例外:函数countInRange中的非穷举模式

该函数应该在getInRange上调用。 getInRange仅从列表中返回大于v1且小于v2的值。这就是它的样子。

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

2 个答案:

答案 0 :(得分:3)

如果我们要简化您的功能甚至只是

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

在这里看到问题了吗?

答案 1 :(得分:2)

您的new_df = pd.merge(cpu, it['product_name', 'url'], on='', how='left') 函数仅需要一个包含一个列表的列表。当您编写countInRange时,仅当列表包含名为countInRange v1 v2 [iL]的单个元素时,才将其定义为与模式匹配。您也可以使用iL

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

count  = length