[Haskell-cafe] ($) not as transparent as it seems
Dan Doel
dan.doel at gmail.com
Thu Feb 3 23:42:49 CET 2011
On Thursday 03 February 2011 5:12:54 PM Tim Chevalier wrote:
> On Thu, Feb 3, 2011 at 2:03 PM, Luke Palmer <lrpalmer at gmail.com> wrote:
> > This is probably a result of strictness analysis. error is
> > technically strict, so it is reasonable to optimize to:
> >
> > let e = error "foo" in e `seq` error e
>
> Yes, and you can see this in the Core code that Don posted: in version
> (A), GHC optimized away the outer call to error. But in version (B),
> the demand analyzer only knows that ($) is strict in its first
> argument -- it's not strict in its second. So it's not obviously safe
> to do the same optimization: the demand analyzer doesn't "look
> through" higher-order function arguments IIRC. (You can confirm this
> for yourself if you also want to read the demand analyzer output.)
>
> If ($) were getting inlined, the code would look the same coming into
> demand analysis in both cases, so you wouldn't see a difference. So
> I'm guessing you're compiling with -O0.
Whatever is going on, it has to be active during ghci, because all these
differences can be seen during interpretation (in 7.0.1, at least).
Prelude> error (error "foo")
*** Exception: foo
Prelude> error $ error "foo"
*** Exception: *** Exception: foo
Prelude> let g :: (a -> b) -> a -> b ; g f x = f x in g error (error "foo")
*** Exception: foo
Prelude> let g :: (a -> b) -> a -> b ; g f x = f x
Prelude> g error (error "foo")
*** Exception: *** Exception: foo
Prelude> let foo = error "foo" in error foo
*** Exception: foo
Prelude> let foo = error "foo"
Prelude> error foo
*** Exception: *** Exception: foo
Actually compiling seems to remove the difference in 7.0.1, at least, because
the output is always:
Foo: foo
regardless of ($) or not ('fix error' hangs without output as well, which
isn't what I thought would happen).
Anyhow, that rules out most general-purpose optimizations (including
strictness analysis, I thought).
- Dan
More information about the Haskell-Cafe
mailing list