代码应采用一个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)]
答案 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