Strictness of Semigroup instance for Maybe

David Feuer david.feuer at gmail.com
Tue May 22 23:37:42 UTC 2018


I think extra laziness here would be a bit surprising.

On Tue, May 22, 2018 at 5:57 PM, Donnacha Oisín Kidney
<mail at doisinkidney.com> wrote:
> The current semigroup instance  for Maybe looks like  this:
>
>     instance Semigroup a => Semigroup (Maybe a) where
>         Nothing <> b       = b
>         a       <> Nothing = a
>         Just a  <> Just b  = Just (a <> b)
>
> However, it could be lazier:
>
>     instance Semigroup a => Semigroup (Maybe a) where
>         Nothing <> b = b
>         Just a  <> b = Just (maybe a (a<>) b)
>
> This causes different behaviour for Data.Semigroup.First and
> Data.Monoid.First:
>
>     >>>  Data.Monoid.getFirst . foldMap pure $ [1..]
>     Just 1
>     >>>  fmap Data.Semigroup.getFirst . Data.Semigroup.getOption . foldMap
> (pure.pure) $ [1..]
>     _|_
>
> A different definition for `Option` gets back the old behaviour:
>
>     newtype LeftOption a = LeftOption { getLeftOption :: Maybe a }
>
>     instance Semigroup a => Semigroup (LeftOption a) where
>       LeftOption Nothing <> ys = ys
>       LeftOption (Just x) <> LeftOption ys = LeftOption (Just (maybe x (x<>)
> ys))
>
>     instance Semigroup a => Monoid (LeftOption a) where
>       mempty = LeftOption Nothing
>       mappend = (<>)
>
>     >>> fmap Data.Semigroup.getFirst . getLeftOption . foldMap (LeftOption .
> Just . Data.Semigroup.First) $ [1..]
>     Just 1
>
> Is there any benefit to the extra strictness? Should this be changed?
>
> Another consideration is that the definition could equivalently be
> right-strict, to get the desired behaviour for Last, but I think the
> left-strict definition probably follows the conventions more.
>
> I originally posted this to reddit
> (https://www.reddit.com/r/haskell/comments/8lbzan/semigroup_maybe_too_strict/)
> and was encouraged to post it here.
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>


More information about the Libraries mailing list