You can also use lazy pattern matching.
http://en.wikibooks.org/wiki/Haskell/Laziness#Lazy_pattern_matching
> splitAt' :: Int -> [a] -> ([a], [a])
> splitAt' n = foldr (\x ~(z1, z2) -> if fst x <= n then (snd x : z1, z2)
> else ([], snd x : z2))
> ([], [])
> . zip [1..]