list - 从右到左处理 Haskell 列表,保持原始顺序

标签 list haskell iteration reverse

需要从 Haskell 列表中的右侧开始每隔一个项目增加一次但保持原始顺序(例如 reverse 不是这种情况)。例如:

 f [1, 2, 3] --  [1, 3, 3]

 f [1, 2, 3, 4] -- [2, 2, 4, 4]

我试过类似以下的东西:
fc ([]) = []
fc (x:[]) = [x]
fc (x:[y]) = [x+1,y]
fc( x:xs ) = fc [x] : ( fc xs ) -- this line is wrong

附言显然我可以反转(但更喜欢理解原始任务)列表两次并应用以下内容:
helper (x:y:tail) = [x, y+1] ++ tail
fc x = reverse (helper (reverse x) )

最佳答案

这可以使用左折叠有效地完成:

inc :: Num a => [a] -> [a]
inc xs = foldl go (\_ _ acc -> acc) xs id (+ 1) []
    where go run x f g acc = run g f (f x: acc)

请注意,即使认为这是左折叠,列表也是使用 cons (:) 运算符构建的;它将线性执行而不是二次执行(类似于 difference lists 中的构造)。
\> inc [1, 2, 3]
[1,3,3]
\> inc [1, 2, 3, 4]
[2,2,4,4]

它也可以推广到 id(+ 1) 以外的交替函数。

关于list - 从右到左处理 Haskell 列表,保持原始顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32808639/

相关文章:

emacs - 超越 while 和 maphash 的迭代?

python - 通过迭代对数据帧字典进行子集化

R - 使用 purrr 在列表列表中用 NA 替换 NULL 元素

C# - 列表中的列表

Haskell 堆栈连接超时

haskell - 如何防止 GHC7 编译程序占用所有内存?

c++ - 使用 Push、Pop 等在 C++ 中创建堆栈

java - 创建数组列表的 HashMap 未按预期工作

haskell - 使用 Haskell @ 更新记录中的单个字段

oracle - 循环遍历数组以获取 where 条件 pl/sql