import Control.Monad (foldM)
import Data.List (partition)

binSplit :: Ord a => [a] -> [a] -> [[a]]
binSplit lims ns = counts ++ [rest] 
  where
    (counts, rest) = foldM split ns lims
    split l i = let (a, b) = partition (< i) l in ([a], b)

binCounts :: Ord a => [a] -> [a] -> [Int]
binCounts b = fmap length . binSplit b