I like Dan to respond better, as I think it is instructive. However, if you were worried about the effectiveness of splitPair , then I think this pretty direct definition works fine:
splitPair :: [a] -> [([a],[a])] splitPair [] = ([],[]) : [] splitPair a@ (x:xs) = ([],a) : map (\(u,v)->(x:u,v)) (splitPair xs)
This definition is somewhat different from the original problem statement in that it returns pairs where the first or last list is empty. This is more consistent with the definition of most list functions, such as tails or inits :
> splitPair [1,2,3,4] [([],[1,2,3,4]),([1],[2,3,4]),([1,2],[3,4]),([1,2,3],[4]),([1,2,3,4],[])]