这是昨天到期的作业,但我不希望答案只是指向正确的方向;)
我正在尝试使用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]
。那么我在这里做错了什么?
提前感谢我指出正确的方向
答案 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 ???)
填补空白