[GHC] #9356: scanl does not participate in stream fusion
GHC
ghc-devs at haskell.org
Thu Jul 24 20:44:23 UTC 2014
#9356: scanl does not participate in stream fusion
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.8.3
Resolution: | Keywords:
Operating System: | Architecture: Unknown/Multiple
Unknown/Multiple | Difficulty: Unknown
Type of failure: Runtime | Blocked By:
performance bug | Related Tickets:
Test Case: |
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
Changes (by dfeuer):
* version: 7.8.2 => 7.8.3
Old description:
> nomeata came up with a fusing version of a strict `scanl'` in a comment
> on #9345. It's not entirely clear to me whether that's entirely safe, but
> a non-strict version of it for `scanl` would be, as both a good producer
> and good consumer, presumably made efficient using the same sorts of
> magic used in HEAD for `foldl`. The strict `scanl'` is obviously safe to
> write as a good consumer; only the production side remains to be proved.
New description:
nomeata came up with a fusable version of a strict `scanl'` in a comment
on #9345 that uses the same basic technique as the new `foldl`. I think we
should use something like the following non-strict version to replace the
current `scanl`:
{{{#!haskell
scanl :: (b -> a -> b) -> b -> [a] -> [b]
scanl f a bs = build $ \c n ->
a `c`
foldr (\b g x -> let b' = f x b in (b' `c` g b'))
(const n)
bs
a
}}}
While we're at it, we should make sure that `map g . scanl f a` and `scanl
f a . map g` fuse properly.
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9356#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list