[Haskell-beginners] splitAt implementation (using foldr) and infinite lists

Lorenzo Bolla lbolla at gmail.com
Mon Apr 16 16:21:55 CEST 2012


On Mon, Apr 16, 2012 at 12:52:02PM +0400, Dmitriy Matrosov wrote:
> Hi all.
> 
> If i implement take using foldr
> 
> take'       :: Int -> [a] -> [a]
> take' n     =  foldr (\x z -> if fst x <= n then snd x : z else []) []
>                . zip [1..]
> 
> it'll work fine with infinite lists. But if i implement splitAt similarly
> 
> 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..]
> 
> and call it like this
> 
> *Main> fst $ splitAt' 4 [1..]
> ^CInterrupted.

Try something like this:
splitAt' n  = foldr (\x zs  -> if fst x <= n then  (snd x : fst zs, snd zs) else              ([], snd x : snd zs)) ([], []) . zip [1..]

I'm no Haskell expert, but I suspect that when pattern-matching z2, it
tries to evaluate it and it hangs...
 
My version does not hang...

hth,
L.


-- 
Lorenzo Bolla
http://lbolla.info



More information about the Beginners mailing list