将op元组转换为一元元组的两个列表
问题描述:
在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)
任何想法我做错了什么?
答
unpair xs
的类型是([a], [b])
,所以您不能像列表中那样追加元素。但是您可以使用let
语句与unpair xs
的结果进行模式匹配,然后构造具有添加到每个元素的新头元素的元组。
我不会引用实际的答案,因为这看起来像家庭作业。
第二个执行工作的原因是因为在那一个unpair
类型是[(a,b)]->[a]
。
'unpair'返回一个_pair_,而不是一个列表。因此,你的两个例子都是错误的。使用(x,y) - >'或'let(x,y)= ... in'的case ..来访问一对的组件。 – chi 2014-12-02 18:51:40