On Thu, 5 Oct 2006, Ch. A. Herrmann wrote:

> Henning Thielemann wrote:
> 
> > ...
> > 
> > The notation
> >   [f x | x <- xs]
> > describes operations on list elements, and looks like the imperative
> >  "forall x in xs do f x",
> > whereas
> >  map f xs
> > is a list transformation. The second one is more abstract, isn't it?
> >  
> for that simple example yes, but what's about list comprehensions like:
> 
> sequence of parsers:
> (p <+> q) r = [ ((x,y), r2) | (x, r1) <- p r, (y, r2) <- q r1 ]

More abstract:

p <+> q = runStateT (liftM2 (,) (StateT p) (StateT q))

If you give the parsers the StateT type, then it is even

<+> = liftM2 (,)


> or triples:
> [ (x,y,z) | x<-[1..n], let x2=x*x, y<-[1..x], let y2=y*y, let z=isq (x2,y2), 
> x2+y2==z*z ]

This is rather a 1:1 translation of an imperative program, a bit shorter,
ok, but it will certainly not impress an imperative programmer. I find it
more important that the generation of pairs, where the first element is
smaller than the second one, can be nicely separated from the Pythagoras
check, due to laziness.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to