Re: [Haskell-cafe] Efficiency/Evaluation Question
There's a very good StackOverflow question which covers this: "When is memoization automatic in GHC?"[1]. I found it really cleared up the issue for me. [1]: http://stackoverflow.com/questions/3951012/when-is-memoization-automatic-in-ghc-haskell On Sat, Jun 15, 2013 at 9:13 PM, Clark Gaebel wrote: > Yes. In general, GHC won't CSE for you. > > - Clark > > > On Saturday, June 15, 2013, Christopher Howard wrote: > >> On 06/15/2013 04:39 PM, Tommy Thorn wrote: >> > >> > >> > There's not enough context to answer the specific question, >> > but lazy evaluation isn't magic and the answer is probably "no". >> > >> > Tommy >> > >> >> Perhaps to simplify the question somewhat with a simpler example. >> Suppose you have >> >> code: >> >> let f x = if (x > 4) then f 0 else (sin x + 2 * cos x) : f (x + 1) >> >> >> After calculating at x={0,1,2,3}, and the cycle repeats, are sin, cos, >> etc. calculated anymore? >> >> -- >> frigidcode.com >> >> > ___ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Efficiency/Evaluation Question
Yes. In general, GHC won't CSE for you. - Clark On Saturday, June 15, 2013, Christopher Howard wrote: > On 06/15/2013 04:39 PM, Tommy Thorn wrote: > > > > > > There's not enough context to answer the specific question, > > but lazy evaluation isn't magic and the answer is probably "no". > > > > Tommy > > > > Perhaps to simplify the question somewhat with a simpler example. > Suppose you have > > code: > > let f x = if (x > 4) then f 0 else (sin x + 2 * cos x) : f (x + 1) > > > After calculating at x={0,1,2,3}, and the cycle repeats, are sin, cos, > etc. calculated anymore? > > -- > frigidcode.com > > ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Efficiency/Evaluation Question
On 06/15/2013 05:02 PM, Christopher Howard wrote: > On 06/15/2013 04:39 PM, Tommy Thorn wrote: > > Perhaps to simplify the question somewhat with a simpler example. > Suppose you have > > code: > > let f x = if (x > 4) then f 0 else (sin x + 2 * cos x) : f (x + 1) > > > After calculating at x={0,1,2,3}, and the cycle repeats, are sin, cos, > etc. calculated anymore? That might have been ambiguous. What I meant was: code: let f x = if (x > 4) then f 0 else (sin x + 2 * cos x) : f (x + 1) If I calculate (f 0), and the cycle repeats after four values, are sin, cos, etc. calculated anymore? -- frigidcode.com signature.asc Description: OpenPGP digital signature ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Efficiency/Evaluation Question
On 06/15/2013 04:39 PM, Tommy Thorn wrote: > > > There's not enough context to answer the specific question, > but lazy evaluation isn't magic and the answer is probably "no". > > Tommy > Perhaps to simplify the question somewhat with a simpler example. Suppose you have code: let f x = if (x > 4) then f 0 else (sin x + 2 * cos x) : f (x + 1) After calculating at x={0,1,2,3}, and the cycle repeats, are sin, cos, etc. calculated anymore? -- frigidcode.com signature.asc Description: OpenPGP digital signature ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Efficiency/Evaluation Question
I expect you'll get many replies... > row (Grid s l) n = if (n >= s) then [] else l !! n > > col g@(Grid s l) n = if (n >= s) then [] else col_ g n 0 >where col_ (Grid s l) n i = if (i >= s) then [] else (head l !! n) : > col_ (Grid s (tail l)) n (i + 1) While such low-level approach (focus on the element) can certainly be made to work, but Haskell encourages you to think in higher level constructs. I haven't seen this problem before but I would map the original array from [[Int]] -> [(Int, (Int, Int), Int, Int)], that is: a list of tuples consisting of the original element, its coordinate, the row maximum and the column minimum. From there its a trivial filter to find your results. (I'm sure there's a more elegant solution). > My question: With the way Haskell works (thunks, lazy evaluation, and > all that mystery), is it actually worth the trouble of /precalculating/ > the maximum row values and minimum column values, to compare cell values > against? Or will, for example, something like (smallest_list_value (col > array 1)) definitely only evaluate once? There's not enough context to answer the specific question, but lazy evaluation isn't magic and the answer is probably "no". Tommy ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe