Use sharing in the Alternative instance of Maybe

Christian Maeder Christian.Maeder at dfki.de
Wed Dec 14 14:49:31 CET 2011


Am 14.12.2011 13:17, schrieb Bas van Dijk:
> 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

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



More information about the Libraries mailing list