リストを前後に2分割
似たネタはいろいろある。リストの分割
code:haskell
{- $setup
>> xs = 1 .. 5 :: Int
-}
ここでは、前後2分割の列挙する
code:haskell
{- |
>> splits xs
[([],1,2,3,4,5),(1,2,3,4,5),(1,2,3,4,5),(1,2,3,4,5),(1,2,3,4,5),(1,2,3,4,5,[])]
>> all ((xs ==) . uncurry (++)) (splits xs)
True
-}
splits :: a -> [(a,a)]
splits xs = zip (inits xs) (tails xs)
空リストを含まない分割の列挙
code:haskell
{- |
>> splitsNE xs
[(1,2,3,4,5),(1,2,3,4,5),(1,2,3,4,5),(1,2,3,4,5)]
>> all ((sample ==) . uncurry (++)) (splitsNE sample)
True
-}
splitsNE :: a -> [(a,a)]
splitsNE = \ case
[] -> []
x:xs -> zipWith3 (const (,)) xs ((x:) <$> inits xs) (tails xs)
#マイクロネタ