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)
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |