我想要写一个函数,它以两个列表作为参数,并从每个列表中连续地创建一个带有一对的列表,但是相反。例如:
reversezipLists [1, 2, 3] ['a', 'b', 'c']会产生[('c', 3), ('b', 2), ('a', 1)]。
以下是我的尝试:
reversezipLists :: [a] -> [b] -> [(b,a)]
reversezipLists [] [] = []
reversezipLists [] ys = []
reversezipLists xs [] = []
reversezipLists (x:xs) (y:ys) = (y,x) : reversezipLists xs ys问题是我的代码的输出是:[('a',1),('b',2),('c',3)]。我怎么才能倒过来呢?
发布于 2020-11-01 12:26:23
使用累加器:
reversezipLists :: [a] -> [b] -> [(b, a)]
reversezipLists = go [] where
go acc [] _ = acc
go acc _ [] = acc
go acc (h1:t1) (h2:t2) = go ((h2, h1) : acc) t1 t2加分:函数是尾递归的。基本思想是,在从左到右遍历列表的过程中,我们向acc添加新的对。Haskell列表的堆叠性质使结果发生了逆转。注意,它将截断更长的列表。
如果您想在列表的长度不匹配时抛出错误,则可以使用模式进行一些操作:
reversezipLists :: [a] -> [b] -> [(b, a)]
reversezipLists = go [] where
go acc [] [] = acc
go acc (h1:t1) (h2:t2) = go ((h2, h1) : acc) t1 t2
go _ _ _ = error "lists' sizes don't match" 发布于 2020-11-01 14:45:01
r (x:xs) (y:ys) = (r xs ys) ++ [(y,x)]
r [] [] = []R1,2,3= ('c',3),('b',2),('a',1)
它仅适用于长度相同的列表。
https://stackoverflow.com/questions/64629257
复制相似问题