4

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

我正在尝试使用和带有haskell的lambda来实现该unzip功能。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]。那么我在这里做错了什么?

提前感谢您为我指明正确的方向

4

2 回答 2

7

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

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

不幸的是,坚持使用map是低效的,因为这意味着您必须通过列表两次。你可以做得更好一点,但这很棘手!试一试,然后将其与GHC 的实现进行比较,看看你做得如何。

于 2012-06-04T03:28:36.383 回答
4

您不能unzip在单个地图中实现

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

所以

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

相反,您需要两张地图

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

填空

于 2012-06-04T03:30:43.357 回答