Use sharing in the Alternative instance of Maybe
Michael Snoyman
michael at snoyman.com
Wed Dec 14 13:19:38 CET 2011
On Wed, Dec 14, 2011 at 2:17 PM, Bas van Dijk <v.dijk.bas at gmail.com> wrote:
> On 14 December 2011 12:51, Michael Snoyman <michael at snoyman.com> 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
>
> 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
Thank you, that's good to know.
Michael
More information about the Libraries
mailing list