Hi

> | {-# 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

Yes, that is exactly it.

>  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.

It worked, with:

{-# INLINE [1] begin1 #-}
{-# INLINE begin2 #-}

I don't think this approach will compose particularly well, and in the
real case I was trying (not this reduced example) I don't think it
will work because there is some recursion and RULES involved. I'll
have another go with the full example in future.

I did however notice an issue while doing this work - in GHC 6.8.2 and
HEAD from Christmas.

{-# INLINE begin2
#-}
Temp.hs:7:1: lexical error at character '}'

In particular if you use the RULES example from the manual, then it
doesn't work.

Thanks

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

Reply via email to