Alternative instance for Const

Simon Jakobi simon.jakobi at googlemail.com
Sat Mar 21 21:46:32 UTC 2020


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


More information about the Libraries mailing list