Haskell对每个n的组列表起作用,使得:: [a] - > Int - > [[a]]

Jim*_*ffa 4 haskell functional-programming function

我确信有一个简单的功能来做到这一点,它应该:

> groupEvery [1,2,3,4,5,6] 2
[[1,2],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)

我只是不知道手和hoogle没有帮助..

Pet*_*lák 10

我不知道有任何内置函数,但它可以很容易地实现:

slice :: Int -> [a] -> [[a]]
slice _ [] = []
slice n xs = hs : slice n ts
  where (hs, ts) = splitAt n xs
Run Code Online (Sandbox Code Playgroud)

它反复将其输入分为第一个n元素和其余元素.或者,使用unfoldr来自Data.List:

slice n = unfoldr (\xs -> if null xs then Nothing 
                                     else Just (splitAt n xs))
Run Code Online (Sandbox Code Playgroud)

更新:为了好玩,我尝试使用标准功能尽可能缩短版本.到目前为止我已经有了

import Data.Functor ((<$))
import Data.List (unfoldr)
import Data.Maybe (listToMaybe)

slice :: Int -> [a] -> [[a]]
slice n = unfoldr (\xs -> splitAt n xs <$ listToMaybe xs)
Run Code Online (Sandbox Code Playgroud)

使用<$from Maybe的实例Functor.或稍微更短但更难以理解的Applicative用途(->) [a]:

slice n = unfoldr (liftA2 (<$) (splitAt n) listToMaybe)
slice n = unfoldr ((<$) <$> splitAt n <*> listToMaybe)
Run Code Online (Sandbox Code Playgroud)

我尝试中最难以理解的版本是

import Control.Monad.Trans
import Control.Monad.Trans.Maybe
slice n = unfoldr (runMaybeT ((MaybeT listToMaybe) >> (lift $ splitAt n)))
Run Code Online (Sandbox Code Playgroud)

  • @JimmyHoffa来自`split的[`chunksOf`](http://hackage.haskell.org/packages/archive/split/0.2.2/doc/html/Data-List-Split.html#v:chunksOf) `package - 一个非常常见的函数. (7认同)

And*_*ács 6

Data.List.Split包中还有chunksOf函数,它是Haskell平台的一部分,完全按照您的描述执行.