【发布时间】:2015-12-03 08:03:27
【问题描述】:
我需要一个递归函数,它从一个元组列表中返回一个列表元组。换句话说,它的类型签名是
func :: [(a,b)] -> ([a],[b])
这是一个例子:
λ> func [(1,3), (2,4)]
([1,2], [3,4])
我创建了两个函数来从元组中返回第一个和第二个元素的列表并将它们连接起来,但我只需要一个递归函数来完成它。
【问题讨论】:
我需要一个递归函数,它从一个元组列表中返回一个列表元组。换句话说,它的类型签名是
func :: [(a,b)] -> ([a],[b])
这是一个例子:
λ> func [(1,3), (2,4)]
([1,2], [3,4])
我创建了两个函数来从元组中返回第一个和第二个元素的列表并将它们连接起来,但我只需要一个递归函数来完成它。
【问题讨论】:
您正在寻找unzip:
unzip :: [(a, b)] -> ([a], [b])
作为一般建议,当您知道类型签名并且想知道是否存在具有该类型签名的任何现有函数时,Hoogle 是一个不错的选择; searching for that type signature 发现 unzip 作为它的第一个也是唯一的结果。
【讨论】:
unzip 标题右侧的“源”链接找到,它指向到this source。不过,这不是很有启发性。具有显式递归的实现可能类似于 unzip [] = []; unzip ((a,b):xs) = (a:as, b:bs) where (as,bs) = unzip xs。