我希望将每个元组的第一个元素存储在列表中,如下所示:
INPUT : [(1,2,3), (1,4,5), (1,6,7)]
Wanted OUTPUT : [(1,1,1)] % Note the tuple notation
这是我到目前为止所写的功能:
f [] = []
f ((x,y,z):xs) = x:(f xs)
但它给了我这个输出:
[1,1,1]
而不是
[(1,1,1)]
我的误解在哪里?
答案 0 :(得分:1)
至于@pdexter的评论中,您无法创建任意长度的元组。所以你想要做的只会在元组完全模式与3个元组的元组匹配时起作用。让我举个例子来澄清我的意思:
helper :: [(Int,Int,Int)] -> (Int,Int,Int)
helper xs = (x,y,z)
where [x,y,z] = f xs
f :: [(Int,Int,Int)] -> [Int]
f [] = []
f ((x,y,z):xs) = x : (f xs)
我们设法通过(x,y,z)
上的模式匹配创建[x,y,z]
,但如果有超过三个元组,我们的模式匹配将不再有效?
所以你应该问自己一个问题是什么,你真的想用这个代码来完成什么样的场景(例如:空元组,相互不同长度的元组,......?)以及如何你的程序应该处理这些不同的情况吗?
如果没有功能原因,为什么你喜欢输出在元组中,我建议你按原样保留函数。
祝你好运!