list - Haskell - 如何以优雅的方式以相反的顺序迭代列表元素?

标签 list haskell iteration reverse

我正在尝试编写一个函数,该函数给出一个数字列表,返回一个列表,其中从最后一个元素开始,每个第二个数字的值都加倍。因此,如果列表元素是 1..n,则第 n 将保持原样,第 (n-1)-th 的值将翻倍,第 (n-2)-将保持原样原样等

所以这是我解决它的方法:

MyFunc :: [Integer] -> [Integer]
MyFunc xs = reverse (MyFuncHelper (reverse xs))

MyFuncHelper :: [Integer] -> [Integer]
MyFuncHelper []       = []
MyFuncHelper (x:[])   = [x]
MyFuncHelper (x:y:zs) = [x,y*2] ++ MyFuncHelper zs

它有效:
MyFunc [1,1,1,1] = [2,1,2,1]
MyFunc [1,1,1] = [1,2,1]

但是,我不禁想到必须有一个比反转列表、处理它然后再次反转它更简单的解决方案。我可以简单地向后迭代列表吗?如果是,如何?

最佳答案

under reversed f xs来自 lens 的成语库将以相反的顺序将 f 应用于 xs:

under reversed (take 5) [1..100] => [96,97,98,99,100]

关于list - Haskell - 如何以优雅的方式以相反的顺序迭代列表元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459241/

相关文章:

c++ - 如何使我的程序接受多个单词

haskell - Haskell 中的乘法列表

python - 在Python中反复求解Gurobi模型

haskell - 从 State 切换到 StateT 后,如何恢复单子(monad)构造列表的惰性求值?

haskell - Applicative Functors 映射的类别到底是什么?

ruby - 如何使用 HAML 遍历数组?

ruby - 避免使用 Enumerable 方法重新计算某些值

Python - 根据用户输入有效地从列表中选择

c++ - 打印一组 STL 列表

java - 动态设置 List<type>