<div dir="auto"><div dir="auto">I don't really understand your purpose. There are many ways to write code that GHC is good at optimizing, but there are far fewer ways to write code that will compile to non-allocating loops without optimization. Heck, without the worker-wrapper transformation demand analysis enables, you can't even get a non-allocating counter without unboxing by hand and using primops for arithmetic.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Sep 4, 2018, 1:00 PM Johannes Waldmann <<a href="mailto:johannes.waldmann@htwk-leipzig.de" target="_blank" rel="noreferrer">johannes.waldmann@htwk-leipzig.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Cafe (again),<br>
<br>
<br>
I was trying to write<br>
<br>
  sum $ map (^ 2) $ [ 1 :: Int .. 10^8 ]<br>
<br>
in a list-free style<br>
<br>
   getSum $ foldMap  (Sum . (^ 2)) $ [ 1 :: Int .. 10^8 ]<br>
<br>
This avoids building an intermediate list (of squares)<br>
but it will allocate, since  foldMap  uses  foldr<br>
(by default, and it's not overridden for lists)<br>
<br>
The conclusion would be: not to use lists at all.<br>
Which will be the point of my talk anyway.<br>
<br>
<br>
But here, we get a list from  enumFromTo. Can we avoid that?<br>
<br>
Let's try: we just reify  enumFromTo<br>
<br>
  data Enumerator a = Enumerator {from :: a, to :: a}<br>
<br>
we have this for decades, it is called  (a,a)  in Data.Ix,<br>
and then<br>
<br>
  instance Foldable Enumerator where ...<br>
<br>
Oh no,  foldMap  (and others) would need an Enum constraint!<br>
<br>
<br>
- J<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sep 4, 2018 1:00 PM, "Johannes Waldmann" <<a href="mailto:johannes.waldmann@htwk-leipzig.de">johannes.waldmann@htwk-leipzig.de</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Cafe (again),<br>
<br>
<br>
I was trying to write<br>
<br>
  sum $ map (^ 2) $ [ 1 :: Int .. 10^8 ]<br>
<br>
in a list-free style<br>
<br>
   getSum $ foldMap  (Sum . (^ 2)) $ [ 1 :: Int .. 10^8 ]<br>
<br>
This avoids building an intermediate list (of squares)<br>
but it will allocate, since  foldMap  uses  foldr<br>
(by default, and it's not overridden for lists)<br>
<br>
The conclusion would be: not to use lists at all.<br>
Which will be the point of my talk anyway.<br>
<br>
<br>
But here, we get a list from  enumFromTo. Can we avoid that?<br>
<br>
Let's try: we just reify  enumFromTo<br>
<br>
  data Enumerator a = Enumerator {from :: a, to :: a}<br>
<br>
we have this for decades, it is called  (a,a)  in Data.Ix,<br>
and then<br>
<br>
  instance Foldable Enumerator where ...<br>
<br>
Oh no,  foldMap  (and others) would need an Enum constraint!<br>
<br>
<br>
- J<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div><br></div>