在haskell中细分列表

Auf*_*gel 13 haskell

如何在haskell中将列表分组为相等长度的较小列表(除了最后一个子列表)?

例如

sublist 3 [1,2,3,4,5,6,7,8] -> [[1,2,3],[4,5,6],[7,8]]
sublist 2 [4,1,6,1,7,3,5,3] -> [[4,1],[6,1],[7,3],[5,3]]
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 23

尝试:

import Data.List.Split
> splitEvery 2 [4,1,6,1,7,3,5,3]
[[4,1],[6,1],[7,3],[5,3]]
Run Code Online (Sandbox Code Playgroud)

  • 您必须先安装[split](http://hackage.haskell.org/package/split)软件包. (7认同)
  • 实际上,仍然推荐"splitEvery"吗?`<interactive>:1:1:警告:在使用'splitEvery'时不推荐使用:"使用chunksOf." (4认同)
  • 像我这样的初学者 - 这意味着运行`cabal install split` (3认同)

red*_*der 9

如果你想坚持前奏,你可以使用它splitAt.

splitEvery _ [] = []
splitEvery n list = first : (splitEvery n rest)
  where
    (first,rest) = splitAt n list
Run Code Online (Sandbox Code Playgroud)

  • 甚至`splitEvery n = takeWhile(not.null).展开(Just.splitAt)` (3认同)

Des*_*sty 8

Data.List.Split模块具有以下chunksOf功能:

Prelude> import Data.List.Split

Prelude Data.List.Split> chunksOf 3 [1,2,3,4,5,6,7,8,9,10]
[[1,2,3],[4,5,6],[7,8,9],[10]]
Prelude Data.List.Split> chunksOf 3 []
[]
Run Code Online (Sandbox Code Playgroud)

它似乎默认安装在我的机器上,但您可能需要使用cabal.


Mag*_*ist 6

我喜欢的另一个解决方案是:

splitEvery :: Int -> [a] -> [[a]]
splitEvery n = takeWhile (not.null) . map (take n) . iterate (drop n)
Run Code Online (Sandbox Code Playgroud)