递归列表元组计数中的Haskell非穷举模式

递归列表元组计数中的Haskell非穷举模式,haskell,Haskell,我试图计算x在列出的元组(整数)中出现的次数。只有元组中的第一个Int需要定位和计数,所以其他两个Int元组并不重要。我正在尝试一个简单的递归计数(这样它将添加1,直到列表为空,然后再添加0),但我得到了一个非穷举模式,我不知道是什么模式丢失导致它 count :: Int -> [(Int, Int, Int)] -> Int count x [] = 0 count x [(a,b,c)] | x == a = 1 + (count

我试图计算x在列出的元组(整数)中出现的次数。只有元组中的第一个Int需要定位和计数,所以其他两个Int元组并不重要。我正在尝试一个简单的递归计数(这样它将添加1,直到列表为空,然后再添加0),但我得到了一个非穷举模式,我不知道是什么模式丢失导致它

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

您只处理元组列表为空或只有一个元素(a、b、c)的两种情况。必须包含一个模式,其中列表包含多个元素。这种模式可以是计数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

你使用了错误的模式<代码>[(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)
模式匹配任何非空的3元组列表,其中第一个是
(a,b,c)
。这允许您按预期使用递归,因为
xs
代表列表的其余部分(减去前3个元组)

请注意,您可以对不关心的参数使用下划线来稍微清理一下:

count :: Int -> [(Int, Int, Int)] -> Int 
count _ []         = 0
count x ((a,_,_):xs)
  | x == a              = 1 + (count x xs)
  | otherwise           = count x xs

非常感谢你。实际上,我有一些类似的东西,但在计数声明中使用了[],而不是((a,b,c):d)。您也可以对数组使用泛型
d
,然后使用类似于fst(first)的东西来获取第一个,但随后您将处理其他事情。