Alternative instance for Const

Oleg Grenrus oleg.grenrus at iki.fi
Sat Mar 21 22:54:12 UTC 2020


https://wiki.haskell.org/Typeclassopedia#Laws_6

On 21.3.2020 23.46, Simon Jakobi via Libraries wrote:
> Hi Zemyla,
>
> Could you clarify where the requirement for distributivity comes from?
>
> The haddocks for Alternative don't mention it:
> http://downloads.haskell.org/~ghc/8.10.1-rc1/docs/html/libraries/base-4.14.0.0/Control-Applicative.html#t:Alternative
>
> Thanks,
> Simon
>
> Am Sa., 21. März 2020 um 21:23 Uhr schrieb Zemyla <zemyla at gmail.com>:
>> No, the Alternative instance should be based on semirings instead. The one you propose isn't distributive.
>>
>> Lacking general semirings, the best we can do at the moment is newtypes for each semiring we have. For instance:
>>
>> newtype NumConst a b = NumConst { getNumConst :: a }
>>    deriving (Functor)
>>
>> instance Num a => Applicative (NumConst a) where
>>    pure = const (NumConst 1)
>>    (<*>) = (coerce :: (a -> a -> a) -> NumConst a (u -> v) -> NumConst a u -> NumConst a v) (*)
>>
>> instance Num a => Alternative (NumConst a) where
>>    empty = NumConst 0
>>    (<|>) = (coerce :: (a -> a -> a) -> NumConst a b -> NumConst a b -> NumConst a b) (+)
>>
>> On Sat, Mar 21, 2020, 13:44 chessai . <chessai1996 at gmail.com> wrote:
>>> We already have
>>>
>>> instance Monoid m => Applicative (Const m)
>>>
>>> we could easily add
>>>
>>> instance Monoid m => Alternative (Const m) where
>>>    empty = coerce mempty
>>>    (<|>) = coerce (<>)
>>>
>>> which trivially satisfies left/right identity and associativity.
>>>
>>> I propose we add this instance to base.
>>> _______________________________________________
>>> Libraries mailing list
>>> Libraries at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries


More information about the Libraries mailing list