如何使用map函数将元组列表拆分为haskell中的两个列表?

时间:2012-06-04 03:22:09

标签: haskell map unzip

这是昨天到期的作业,但我不希望答案只是指向正确的方向;)

我正在尝试使用unzip和lambda与haskell实现map函数。

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

因此我认为lambda看起来像\(a,b)->([a],[b])而且除了我从[(4,5),(7,5),(9,7)] => [([4],[5]),([7],[5]),([9],[7])]的输入中得到的结果之外,我还希望看到[4,7,9],[5,5,7] 。那么我在这里做错了什么?

提前感谢我指出正确的方向

2 个答案:

答案 0 :(得分:6)

好吧,map :: (a -> b) -> ([a] -> [b])会返回一个列表,对吗?并且您希望您的函数返回两个列表,因此......您需要使用map两次。这是您填写的骨架:

unzip xs = (map {- ??? -} xs, map {- ??? -} xs)

不幸的是,坚持使用map是低效的,因为这意味着你必须在列表上进行两次传递。你可以做得更好,但这很棘手!试一试,然后通过将其与GHC's implementation进行比较来了解您的表现。

答案 1 :(得分:4)

您无法在单个地图中实施unzip

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

所以

map \(a,b)->([a],[b]) :: [(a,b)] -> [([a],[b])]

而你需要两个地图

unzip ls = (map ???,map ???)

填补空白