2015-09-07 142 views
2

我需要一个递归函数,它从元组列表返回列表元组。换句话说,它的类型签名将是将元组列表转换为递归列表元组

func :: [(a,b)] -> ([a],[b]) 

下面是一个例子:

λ> func [(1,3), (2,4)] 
([1,2], [3,4]) 

我提出两个函数返回从所述元组的第一和第二元件和将它们连接的列表,但我只需要一个递归函数来完成它。

回答

8

您正在寻找unzip

unzip :: [(a, b)] -> ([a], [b]) 

作为一般性的建议,当你知道一个类型的签名,你想知道是否有任何已经存在的功能有类型签名,Hoogle是一个很好的赌注; searching for that type signature发现unzip是其第一个也是唯一的结果。

+0

我可以找到解压缩的实现吗?我搜索了它,但没有成功。 – AnimeBear

+0

@AnBeBear:那么,GHC使用的实现可以通过单击链接到的文档中的“unzip”标头右侧的“Source”链接来找到,该链接指向[this source](https ://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.List.html#unzip)。虽然这不是很有启发性,具有显式递归的实现可能看起来像'unzip [] = [];解压缩((a,b):xs)=(a:as,b:bs)其中(as,bs)= unzip xs'。 – icktoofay