递归列表元组计数中的Haskell非穷举模式
我试图计算x在列出的元组(整数)中出现的次数。只有元组中的第一个Int需要定位和计数,所以其他两个Int元组并不重要。我正在尝试一个简单的递归计数(这样它将添加1,直到列表为空,然后再添加0),但我得到了一个非穷举模式,我不知道是什么模式丢失导致它递归列表元组计数中的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
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)的东西来获取第一个,但随后您将处理其他事情。