[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