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

List 计算嵌套列表中大于或小于某些值的值的数量,list,haskell,nested,runtime-error,non-exhaustive-patterns,List,Haskell,Nested,Runtime Error,Non Exhaustive Patterns,我正在处理一个家庭作业问题的函数,该函数计算列表中大于v1小于v2的值的数量。我把一些东西放在一起,但只在特定的情况下有效。当我尝试其他东西时,我得到的错误是 ***异常:函数countInRange中的非穷举模式 此函数应该调用getInRangegetInRange只返回列表中大于v1且小于v2的值。这是它的样子 rangeHelper v1 v2 x | x > v1 && x < v2 = True | otherwis

我正在处理一个家庭作业问题的函数,该函数计算列表中大于
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 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 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))

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))


countInRange v1 v2[iL]
应为
countInRange v1 v2 iL
(无方括号,您的版本仅适用于单个列表,其成员本身就是数字列表)。除非你真的想让它接受一个列表,但这(即使输入“有效”)对我来说看起来很奇怪。要求是我需要传入两个值和一个嵌套列表,因为我需要能够处理列表中的列表。(次要样式点:
rangeHelper v1 v2 x=x>v1&&x
更简单。不要检查布尔值是否为真/假,只返回完全相同的值。)我不完全理解您的目标。
countInRange 3 10[[1,2],[3,40]
的预期结果是什么?三个?因此,一般来说
countInRange 3 10[[a,b],[c,d]]< /代码>必须与<代码> Cordina Read 3 10 [ [a,b,c,d] ] < /代码>相同,如果是,请考虑<代码> CONTAG/COD>在计数之前将列表列表放入一个列表中。当调用CurrnRead 3 10 [[1,2],[4],5],6]时,目标是打印3的值。因为4,5,6是唯一大于3小于10的值。
countInRange v1 v2[iL]
应该是
countInRange v1 v2 iL
(没有方括号,您的版本只适用于单例列表,其成员本身就是一个数字列表)。除非您确实希望它接受列表列表,但(即使输入“有效”)对我来说也很奇怪。要求是我需要传入两个值和一个嵌套列表,因为我需要能够处理列表中的列表。(次要样式点:
rangeHelper v1 v2 x=x>v1&&x
更简单。不要检查布尔值是否为真/假,只返回完全相同的值。)我不完全理解您的目标。
countInRange 3 10[[1,2],[3,40]
的预期结果是什么?三个?因此,一般来说
countInRange 3 10[[a,b],[c,d]]< /代码>必须与<代码> Cordina Read 3 10 [ [a,b,c,d] ] < /代码>相同,如果是,请考虑<代码> CONTAG/COD>在计数之前将列表列表放入一个列表中。当调用CurrnRead 3 10 [[1,2],[4],5],6]时,目标是打印3的值。因为4,5,6是唯一大于3小于10的值。通过您的编辑,答案会更好。StackOverflow处于最佳状态(imho)。多亏了您。只需进行一点复制编辑即可。:)主要想法是你的。不客气。这提醒了我:为了更清楚地看到问题,在代码仍然表现出相同的问题行为时,尽可能地最小化代码。我称之为最小化或测试用例生成,这是我最喜欢的/转到调试技术。通过编辑,答案会更好。StackOverflow处于最佳状态(imho)。多亏了你。只需编辑一点副本就够了。:)主要想法是你的。不客气。这提醒我:为了更清楚地看到问题,在代码仍然表现出相同的问题行为时,尽可能地最小化代码。我称之为最小化或测试用例生成,这是我最喜欢的调试技术。而不是过滤和计算每个列表,然后对cou求和nts,我认为连接、过滤然后计数更简单,如
length.filter(rangeHelper v1 v2).concat
@chi当然,这将是一个更好的解决方案,我只是尝试在现有解决方案中尽可能少地进行更改,而不是对每个列表进行筛选和计数,然后对计数进行求和,我认为串联、筛选,然后计数更简单,如
length.filter(rangeHelper v1 v2).concat
@chi当然,这是一个更好的解决方案,我只是尝试在现有解决方案中尽可能少地进行更改