Add an extra class to Control.Applicative.Alternative

Daniel Gorín dgorin at
Thu May 1 18:01:54 UTC 2014

On 01 May 2014, at 13:19, S D Swierstra <doaitse at> wrote:

> I have probably not been clear enough. The relationship that should hold between getPure and getNonPure is as follows:
> case (getPure p, genNonPure p) of
>  (Nothing, Nothing)       -> "should not happen since p should have at least a pure or a nonpure part"
>  (Just pp,  Just npp)        -> pure pp <|> npp
>  (Just np,  Nothing)        -> pure np
>  (Nothing, Just npp)       -> npp
> is equivalent to p.
> I do not see how this would correspond to your use of Either? 
> Doaitse

Would this then be equivalent to the following? 

class Alternative f => Splittable f where
 split :: f a -> (Maybe a, f a)

 isEmpty :: f a -> Bool
 isEmpty = isNothing . fst . split

One then would have something like:

getPure = fst . split

getNonPure x = guard (not (isEmpty fa)) >> Just fa
 where fa = snd (split x)

and the expected laws might be easier to state


More information about the Libraries mailing list