Ваш код работает нормально.
Однако я бы предложил разделить список за один проход, не используя length
. Конечно, порядок здесь не важен, просто у нас есть два списка примерно одинакового размера. Вы можете сделать это так:
splitList [] = ([],[])
splitList [x] = ([x],[])
splitList (x:y:zs) = let (xs,ys) = splitList zs in (x:xs, y:ys)
... или рекурсивный хвост ...
splitList zs = go zs [] [] where
go [] xs ys = (xs, ys)
go [x] xs ys = (x:xs, ys)
go (x:y:zs) xs ys = go zs (x:xs) (y:ys)
... или используя индексы ...
splitList xs = (go even, go odd) where
go f = map snd $ filter (f.fst) $ indexed
indexed = zip [0..] xs
... или используя складку ...
import Data.List
splitList zs = snd $ foldl' go (True,([],[])) zs where
go (True,(xs,ys)) x = (False,(x:xs,ys))
go (False,(xs,ys)) x = (True,(xs,x:ys))