我试图计算x在一个(整数)元组中出现的次数。它只是元组中需要定位和计数的第一个Int,因此其他两个Int元组并不重要。我正在尝试简单的递归计数(因此它将加1直到列表为空,然后它将加0),但是我得到了一个非穷尽的模式,而且我不知道是什么模式导致了它。 / p>
count :: Int -> [(Int, Int, Int)] -> Int
count x [] = 0
count x [(a,b,c)]
| x == a = 1 + (count x [(a,b,c)])
| otherwise = count x [(a,b,c)]
答案 0 :(得分:5)
您仅处理两种情况,其中元组列表为空或仅具有一个元素(a,b,c)。您必须包括列表中包含多个元素的模式。这样的模式可能是count x ((a,b,c):d)
最后它应该看起来像这样:
count :: Int -> [(Int, Int, Int)] -> Int
count x [] = 0
count x ((a,b,c):d)
| x == a = 1 + (count x d)
| otherwise = count x d
答案 1 :(得分:3)
您使用了错误的模式。 [(a,b,c)]
仅匹配完全由一个 3元组组成的列表。我相信你的意思是这样的:
count :: Int -> [(Int, Int, Int)] -> Int
count x [] = 0
count x ((a,b,c):xs)
| x == a = 1 + (count x xs)
| otherwise = count x xs
此处((a,b,c):xs)
模式与任何非空的三元组列表匹配,其中第一个是(a,b,c)
。这使您可以按预期使用递归-因为xs
代表列表的其余部分(减去前三个三元组)。
请注意,您可以通过在不需要的参数上使用下划线来清除这一点:
count :: Int -> [(Int, Int, Int)] -> Int
count _ [] = 0
count x ((a,_,_):xs)
| x == a = 1 + (count x xs)
| otherwise = count x xs