On Thu, 3 Jan 2008, Don Stewart wrote: > You can, with some caveats, use a single fusion system across data > structures, and avoid the built in build/foldr system. > > I'd start by installing the stream-fusion list library, from hackage, > which gives you the list api, and a fusion mechanism. > > To avoid the build in fusion system, you need to:
With 'build in' you mean the fusion system of Prelude? > * avoid list comprehensions > * avoid .. (use Stream.enumFromTo instead) No problem. > then you can write fusion rules for your structure in terms of streams, > and they'll fuse with list operations as well. But then in order to fuse your streams with my chunky sequences I have to know, how stream-fusion fuses streams, right? Anyway, I tried to wrap Prelude lists in a newtype and thus got GHC (still 6.4.1) to invoke my rules instead of the Prelude rules. But I encountered the following problem: I define something like nonFusable x y = fusable (aux x y) where fusion rules are defined for 'fusable', but not for 'nonFusable'. I hoped that 'nonFusable' will be inlined and then 'fusable' is fused with other expressions. This does not happen. If I state the function definition also as rule, then GHC fuses eagerly. Analogously I observed that usage of ($) and (.) blocks fusion, and when I add the rules "unfold-dollar" forall f x. f $ x = f x ; "unfold-dot" forall f g. f . g = \x -> f (g x) ; then fusion takes place as expected. Am I doing something wrong? Do I have to dig into phase control? I wouldn't like that, since it seems to be too fragile. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe