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

时间:2019-03-13 14:20:27

标签: haskell

我试图计算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)]

2 个答案:

答案 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