リストを前後に2分割
code:haskell
{- $setup
-}
ここでは、前後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 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 = \ case
[] -> []
x:xs -> zipWith3 (const (,)) xs ((x:) <$> inits xs) (tails xs)