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

Zar*_*oth 5 iteration reverse haskell list

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

所以这就是我如何解决它:

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
Run Code Online (Sandbox Code Playgroud)

它有效:

MyFunc [1,1,1,1] = [2,1,2,1]
MyFunc [1,1,1] = [1,2,1]
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ley 9

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

under reversed (take 5) [1..100] => [96,97,98,99,100]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,"反转f xs"在此处给出相同的结果,而"over"是更常用的镜头组合器. (5认同)