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

Dmitriy Matrosov sgf.dma at gmail.com
Mon Apr 16 18:12:54 CEST 2012


On 04/16/12 18:21, Lorenzo Bolla wrote:
> 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.
>
Thanks, Lorenzo! It works now.

On 04/16/12 18:55, Ozgur Akgun wrote:
> You can also use lazy pattern matching.
>
> http://en.wikibooks.org/wiki/Haskell/Laziness#Lazy_pattern_matching
>
> On 16 April 2012 15:21, Lorenzo Bolla <lbolla at gmail.com 
> <mailto:lbolla at gmail.com>> wrote:
>
>     > 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..]
>
>
> Ozgur
Thanks, Ozgur!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20120416/ac7270c5/attachment.htm>


More information about the Beginners mailing list