| {-# INLINE foo #-}
| foo = large
|
| bar x = if x then res else res
|     where res = foo
|
| By putting an INLINE on foo I am able to persuade it to be inlined
| into the binding of bar, but I can't then persuade it to be inlined at
| the let expression.

I'm not certain what you mean here.  I think you mean that in the above code 
you end up with
        bar x = let res = large in if x then res else res
whereas what you wanted was
        bar x = if x then large else large


That is indeed tricky in general, as I'm sure you can see:

        let x = <large> in
        let y = e2[x,x] in
        let z = e3[y] in
        ...

Is it better to inline x into e2, or y into e3, or z into e4?  Hard to tell!

In your example, you want 'res' to inline "first".  You can get that by 
explicit control:

{-# NOINLINE [0] foo #-}

That says "don't inline foo before phase 0", which in turn gives time for 'res' 
to get inlined first.  I'm not certain whether that'll help in your actual 
example.

Simon
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to