slight difference in strictness between -O0 and -O

Kirsten Chevalier catamorphism at gmail.com
Tue Mar 13 05:20:35 EDT 2007


On 3/12/07, Kirsten Chevalier <catamorphism at gmail.com> wrote:
> On 3/12/07, Kirsten Chevalier <catamorphism at gmail.com> wrote:
> > On 3/12/07, Albert Y. C. Lai <trebla at vex.net> wrote:
> > > main = print (map (const 'x') (take 1 (undefined:undefined)))
> > >
> > > In ghci, or with ghc -O0, this produces "x".
> > > With ghc -O, this produces Prelude.undefined.
> > >
> >
> > What version of ghc?
> >
>
> I was curious, so I checked this against ghc 6.6. Indeed, it exhibits
> the behavior Albert describes above. Same goes for the HEAD. In ghc
> 6.4.2, however, the program prints "x" whether compiled with -O or
> -O0.
>
> This does seem like a bug to me.
>

I noticed that compiling with -O -frules-off causes the test program
here to correctly print out "x". So, I was looking at the "take" rule
in GHC/List.lhs. Doesn't this rule change the strictness of take?

"take"	   [~1] forall n xs . take n xs = case n of I# n# -> build (\c
nil -> foldr (takeFB c nil) (takeConst nil) xs n#)

Cheers,
Kirsten

-- 
Kirsten Chevalier* chevalier at alum.wellesley.edu *Often in error, never in doubt
"It's a woman's dream, this autonomy / Where the lines connect and the
points stay free" -- Ferron


More information about the Glasgow-haskell-users mailing list