
Am 14.12.2011 13:17, schrieb Bas van Dijk:
On 14 December 2011 12:51, Michael Snoyman
wrote: Out of curiosity, does this actually bypass an extra allocation, or is GHC smart enough to notice the possibility to share?
With optimizations on, GHC seems to be smart enough. Since the optimized core of:
plus1 Nothing r = r plus1 (Just x) _ = Just x
I suggest to directly write this using case: l <|> r = case l of Nothing -> r Just _ -> l C.
Looks like:
Maybe.plus1 = \ (@ a_acI) (ds_dcO :: Data.Maybe.Maybe a_acI) (r_abo :: Data.Maybe.Maybe a_acI) -> case ds_dcO of wild_X6 { Data.Maybe.Nothing -> r_abo; Data.Maybe.Just x_abp -> wild_X6 }
Which is equivalent to the optimized core of:
plus2 Nothing r = r plus2 l _ = l
Which looks like:
Maybe.plus2 = \ (@ t_acG) (ds_dcK :: Data.Maybe.Maybe t_acG) (r_abq :: Data.Maybe.Maybe t_acG) -> case ds_dcK of wild_X7 { Data.Maybe.Nothing -> r_abq; Data.Maybe.Just ipv_scU -> wild_X7 }
With -O0 the core of plus1 looks like:
Maybe.plus1 = \ (@ a_acG) (ds_dcM :: Data.Maybe.Maybe a_acG) (r_abm :: Data.Maybe.Maybe a_acG) -> case ds_dcM of _ { Data.Maybe.Nothing -> r_abm; Data.Maybe.Just x_abn -> Data.Maybe.Just @ a_acG x_abn }
Cheers,
Bas