代码应该获取一个Int并将其与列出的元组中的第一个Int进行比较(其他Int无关紧要),因此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)]发布于 2019-03-14 21:32:16
这不是“溢出”,这是无限递归。请注意,
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)发布于 2019-03-14 21:32:11
您可以使用filter完成此操作
listTuples' :: Int -> [(Int, Int, Int)] -> [(Int, Int, Int)]  
listTuples' x ls = filter (\(p, _, _) -> p == x) lshttps://stackoverflow.com/questions/55163795
复制相似问题