1

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

*** 例外:函数 countInRange 中的非详尽模式

这个函数应该调用 on getInRangegetInRange只返回列表中大于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
4

2 回答 2

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

你能看出问题来了吗?

于 2019-09-26T07:44:30.240 回答
2

您的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))
于 2019-09-26T08:03:45.870 回答