使用Int返回列表中的特定元组会导致溢出

时间:2019-03-14 13:28:04

标签: haskell

代码应采用一个Int并将其与列出的元组中的第一个Int进行比较(其他Ints无关紧要),因此Int x应该与((p,q,r):ys)中的p进行比较并返回只要x == p,列表[[p,q,r),(p,q,r)]。该代码可以编译,但是在测试时会溢出,并且我不确定这是语法问题还是无法补偿完整列表。

listTuples :: Int -> [(Int, Int, Int)] -> [(Int,Int,Int)]
listTuples x [] = []
listTuples x ((p,q,r) : ys)
 | x == p    = listTuples x ((p,q,r) : ys)
 | otherwise = []

测试:

 listTuples 3 [(3,4,5),(4,3,5),(3,6,7)]

返回:

 [(3,4,5),(3,6,7)]

2 个答案:

答案 0 :(得分:4)

这不是“溢出”,而是无限递归。请注意

listTuples x ((p,q,r) : ys)
    = listTuples x ((p,q,r) : ys)
    = listTuples x ((p,q,r) : ys)
    = ...

我认为您想要什么:

listTuples x ((p,q,r) : ys)
 | x == p    = (p,q,r) : listTuples x ys
 | otherwise = listTuples x ys

正如丹尼尔·瓦格纳(Daniel Wagner)所说,编写此函数的更好方法是

   filter (\(p,_,_) -> x==p)

答案 1 :(得分:3)

您可以使用filter

listTuples' :: Int -> [(Int, Int, Int)] -> [(Int, Int, Int)]  
listTuples' x ls = filter (\(p, _, _) -> p == x) ls