On 07/25/2013 10:41 AM, Edward Kmett wrote:
One of the open concerns about
it is definitely ensuring that we get the fusion
opportunities we can.
If you put an INLINE pragma on your Foldable
version of each do the fusion rules fire after it
gets inlined into a call site that uses it as a
list?
I tried both INLINE and INLINABLE and neither causes the
fusion rules to fire. I also tried:
* adding an orphan SPECIALIZE rule for
`Data.Foldable.mapM_` in the module where I defined `each`
* Specializing the type of `each` to consume lists, but
still using the `Foldable` `mapM_`
* Defining a new copy of `each` (using the `Foldable`
version) in the same module as the code that uses it,
specializing the type signature to lists, and trying out
INLINE/INLINABLE or no pragma.
None of those causes the rule to fire, either.
-Edward
On Thu, Jul 25, 2013 at
1:22 PM, Gabriel Gonzalez
<gabriel439@gmail.com>
wrote:
I'm now in favor of
the `Data.Foldable` proposal, but I just
wanted to mention that the proposal needs to
include some extra pragma work to ensure that
build/foldr optimizations fire. I was just
experimenting with the following combinator
for `pipes` trying out the following two
versions:
each :: (Monad m) => [a] -> Producer
a m ()
each = mapM yield
each :: (Monad m, Foldable f) => f a
-> Producer a m ()
each = Data.Foldable.mapM yield
When I do a pure `pipes`-based fold over both
`Producers`s, the version specialized to lists
triggers a firing of the build/foldr fusion
rule and runs about 20% faster. The true
improvement for `mapM` by itself is probably
even greater than that because I haven't
optimized the folding code yet. The latter
version does not trigger the rule firing.
Either way I'm going to include the latter
`Foldable` version but I just wanted to
mention this because I remember people were
asking if this would impact fusion or not.
_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://www.haskell.org/mailman/listinfo/libraries