作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
标准库包括一个函数
unzip :: [(a, b)] -> ([a], [b])
unzip xs = (map fst xs, map snd xs)
zip
可以很容易地实现为
zip :: [a] -> [b] -> [(a, b)]
zip (a:as) (b:bs) = (a,b) : zip as bs
unzip
来自标准库的代码设法在一次遍历中完成此操作(这是在库中实现这个原本微不足道的功能的全部意义所在),但我实际上并不知道它是如何工作的。
最佳答案
是的,it is possible :
unzip = foldr (\(a,b) ~(as,bs) -> (a:as,b:bs)) ([],[])
unzip [] = ([], [])
unzip ((a,b):xs) = (a:as, b:bs)
where ( as, bs) = unzip xs
~(as, bs)
是让它实际上懒惰地工作:
Prelude> let unzip' = foldr (\(a,b) ~(as,bs) -> (a:as,b:bs)) ([],[])
Prelude> let unzip'' = foldr (\(a,b) (as,bs) -> (a:as,b:bs)) ([],[])
Prelude> head . fst $ unzip' [(n,n) | n<-[1..]]
1
Prelude> head . fst $ unzip'' [(n,n) | n<-[1..]]
*** Exception: stack overflow
关于list - 一口气解压?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287848/
我是一名优秀的程序员,十分优秀!