Haskell,列表上的模式匹配,以获取具有任意长度的元组的每个第一个元素

时间:2016-07-19 10:11:44

标签: haskell pattern-matching tuples

我希望将每个元组的第一个元素存储在列表中,如下所示:

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)]

我的误解在哪里?

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],但如果有超过三个元组,我们的模式匹配将不再有效?

所以你应该问自己一个问题是什么,你真的想用这个代码来完成什么样的场景(例如:空元组,相互不同长度的元组,......?)以及如何你的程序应该处理这些不同的情况吗?

如果没有功能原因,为什么你喜欢输出在元组中,我建议你按原样保留函数。

祝你好运!