On Wed, 2008-09-24 at 22:44 +0100, Iain Barnett wrote: > On 24 Sep 2008, at 10:13 pm, Evan Laforge wrote: > > For one approach, check > > out 'replicate' to make copies of something, and then 'sequence' to > > run them and return a list.
> Thanks, I haven't found anything that explains 'sequence' well yet, > but I'll keep looking. sequence is one of your more general-purpose loop functions in Haskell. Frequently, the number of passes in a loop and the job of each pass are fixed before-hand. Standard lazy-evaluation constructs like iterate, replicate, and map make it easy to produce a list of the passes you want to use. (This is the data-structure-as-control-construct pattern). sequence then supplies the last step: it takes a list (in the principle examples, a list of passes through some loop) and returns a loop that goes through and executes all the passes. In sequence, ironically enough. > On 24 Sep 2008, at 10:13 pm, John Van Enk wrote: > > And the one liner: > > (rand 1 10) >>= return . (\v -> take v [1..10]) > my last attempt before emailing was > (rand 1 10 ) >>= (\x -> take x [1..10]) > So close! :) > I can see now, with all the examples, why the return is needed, but > not why the composition operator is. Something for me to look into. Btw: the composition operator isn't needed. You can inline it into your example and get (rand 1 10) >>= (\ v -> return ((\ v -> take v [1..10]) v)) (which is equivalent to the clearer (rand 1 10) >>= (\ v -> return (take v [1..10])) by a step closely related to inlining (beta-contraction, to be specific)). I don't know why composition was used in this case. Using the version (\ v -> take v [1..10]) <$> (rand 1 10) and using the definition f <$> a = a >>= return . f gives rise to it. jcc _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe