2012-06-04 16 views
3

这是昨天的功课,但由于我不想要的答案只是一个指向正确的方向,请;)如何使用map函数将哈希克尔中的元组列表分割成两个列表?

我试图实现使用map和lambda与哈斯克尔的unzip功能。

: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]。那么我在这里做错了什么?

预先感谢我指出了正确的方向

回答

6

好,map :: (a -> b) -> ([a] -> [b])返回一个列表,对不对?而且你希望你的函数返回两个列表,所以...你需要使用两次map。这里有一个骷髅为你填:

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

不幸的是,坚持使用map是低效的,因为这意味着你必须在列表上两遍。你可以做得更好,但这很棘手!给它一个镜头,然后通过与GHC's implementation比较,看看你做得如何。

4

你不能在一个单一的地图

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

所以

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

,而不是你需要实施unzip映射

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

填空

相关问题