You can also try this:

 

bunch n f = takeWhile (not . null) . unfoldr (Just . (f *** id) . splitAt n)

> (bunch 8 . bunch 4 . bunch 2) id [1..16]

 

Any way, it’s not possible to take list [8, 4, 2], because it’s length need to be known at compile time.