2014-12-02 138 views
0

在haskell我试图将[(1,2),(3,4),(5,6)] 这样的列表转换为两个清单:[1,3,5]和[2,4,6]使用递归函数只将op元组转换为一元元组的两个列表

这个我试过,到目前为止,但它不工作

unpair :: [(a,b)] -> ([a], [b]) 
unpair [] = [] 
unpair ((x,y):xs) = x : unpair(xs) y : unpair (xs) 

然而,当,我只尝试列出元组中的第一个值,它的确行得通:

unpair [] = [] 
unpair ((x,y):xs) = x : unpair(xs) 

任何想法我做错了什么?

+0

'unpair'返回一个_pair_,而不是一个列表。因此,你的两个例子都是错误的。使用(x,y) - >'或'let(x,y)= ... in'的case ..来访问一对的组件。 – chi 2014-12-02 18:51:40

回答

4

unpair xs的类型是([a], [b]),所以您不能像列表中那样追加元素。但是您可以使用let语句与unpair xs的结果进行模式匹配,然后构造具有添加到每个元素的新头元素的元组。

我不会引用实际的答案,因为这看起来像家庭作业。


第二个执行工作的原因是因为在那一个unpair类型是[(a,b)]->[a]