Extract integers from a string that is split at given positions
Walking across the list of positions from the right cuts off suffixes, requiring you to keep traversing and copying the corresponding prefixes over. If you cut off prefixes instead, you only need to traverse once.

import Data.List
import Data.Tuple

splitAts :: [Int] -&gt; [a] -&gt; ([[a]], [a])
splitAts is xs = swap $ mapAccumL go xs (zipWith (-) is (0:is)) where
  go :: [a] -&gt; Int -&gt; ([a], [a])
  go xs i = swap $ splitAt i xs


This piece of code is, incidentally, the epitome of order confusion and what wouldn't happen if there was a way to bundle API updates with automatic patchers to old code.