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

4

这是昨天到期的作业,但是我不想要答案,只需要指向正确方向的提示;)

我正在尝试使用 Haskell 中的 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]。那么我在这里做错了什么呢?
感谢您提前指出方向。
2个回答

7

哦,map :: (a -> b) -> ([a] -> [b]) 返回一个列表,对吧?而你希望你的函数返回两个列表,所以……你需要使用 map 两次。下面是一个供你填写的框架:

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

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


4

你不能在单个映射中实现unzip

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

so

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

相反,您需要 两个 地图

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

填空


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接