如何在haskell中將列表分組爲一個長度相等(除最後一個子列表之外)的較小列表?在haskell中細分列表
E.g.
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]]
如何在haskell中將列表分組爲一個長度相等(除最後一個子列表之外)的較小列表?在haskell中細分列表
E.g.
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]]
如果你想堅持的前奏,你可以使用splitAt
拉這一關。
splitEvery _ [] = []
splitEvery n list = first : (splitEvery n rest)
where
(first,rest) = splitAt n list
嘗試:
import Data.List.Split
> splitEvery 2 [4,1,6,1,7,3,5,3]
[[4,1],[6,1],[7,3],[5,3]]
您必須首先安裝[split](http://hackage.haskell.org/package/split)軟件包。 – ehird 2011-12-30 15:36:30
對於像我這樣的初學者來說 - 那意味着運行'cabal install split' – 2015-03-06 17:20:10
其實,'splitEvery'還是推薦的嗎? '
,我喜歡另一種解決方案是:
splitEvery :: Int -> [a] -> [[a]]
splitEvery n = takeWhile (not.null) . map (take n) . iterate (drop n)
又一解決方案:
split :: Int -> [a] -> [[a]]
split n = unfoldr (\s -> if null s then Nothing else Just $ splitAt n s)
我知道這是舊的,但因爲這似乎是人誰是後對於Haskell來說相當新穎,我覺得也想發佈我的解決方案。我嘗試用序曲來解決這個問題,只有:
sublist :: Int -> [a] -> [[a]]
sublist n ls
| n <= 0 || null ls = []
| otherwise = take n ls:sublist n (drop n ls)
測試
sublist 3 [1,2,3,4,5,6] -- λ> [[1,2,3], [4,5,6]]
sublist 5 [1,2,3] -- λ> [[1,2,3]]
sublist (-1) [1,2,3] -- λ> []
sublist 20 [] -- λ> []
的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 []
[]
它似乎被安裝默認在我的機器上,但你可能需要用cabal來獲得它。
甚至'splitEvery N = takeWhile(不爲空)。 unfoldr(Just。splitAt n)' – newacct 2011-12-31 11:32:35