【发布时间】:2019-05-06 16:50:37
【问题描述】:
我想写一个函数,它接受一个列表作为输入值并按以下方式操作它:
第 1 步:将列表的每 3 个元素放入一个子列表。 如果剩余的元素少于 3 个,则剩余的元素将放在一个特定的子列表中,该子列表与步骤 2 无关。
第 2 步:颠倒创建的子列表中元素的顺序。 第一个元素应该放在第三个元素的位置,第二个元素应该放在第一个元素的位置,第三个元素应该放在第二个元素的位置。 ([1,2,3] 转换为 [2,3,1])
例子:
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
-- should be transformed to
[[2,3,1],[5,6,4],[8,9,7],[11,12,10],[14,15,13],[16,17]]
到目前为止,我找到了以下方法将每 3 个元素放在子列表中,但我不太确定如何更改每个子列表中元素的顺序以符合要求。
splitEvery :: Int -> [a] -> [[a]]
splitEvery _ [] = []
splitEvery n xs = as : splitEvery n bs
where (as,bs) = splitAt n xs
【问题讨论】:
-
您可以使用一个单独的函数来反转长度为 3 的列表的元素。它只会返回任何其他列表的列表而无需修改。
-
[1,2,3]到[2,3,1]是旋转,而不是反转(应该是[3,2,1])。
标签: list haskell pattern-matching