[Haskell-beginners] Alternative instance w/ additional restriction

David McBride toad3k at gmail.com
Wed Jun 7 15:25:26 UTC 2017


The Alternative class says nothing about the a in MyData a.  It only
represents code relevant to MyData.

When you see class Applicative f => Alternative (f :: * -> *), that
means all of its functions had to work on any f, where f takes any
type and becomes some other type which could be anything.

The reason it works for Monoid is that class Monoid a where implies
that a is completely known by the time the instance is fulfilled,
therefore the instance can look at what a ended up being and ensure
whatever a is, it must have this constraint on it.

You can tell the difference because mempty returns a type that
mentions the a mentioned in the class, whereas empty returns an a that
is not mentioned in the class, therefore it has to work for any a.

On Wed, Jun 7, 2017 at 8:26 AM, Baa <aquagnu at gmail.com> wrote:
> Hello all!
>
> If I try to write, for example:
>
>   instance Alternative MyData where
>     empty = NoMyData
>     a <|> b = if a == b then ...
>
> I get error (see on bottom of the mail) sure, bcz I suppose something
> like:
>
>    Eq a => (MyData a)
>
> All my attempts to add something to instance's `pure` signature have
> failed. How can I instantiate something with additional restrictions,
> like in this case? Or are there another solutions for such problem?
>
> Interesting is that MyData derives Eq itself! Which, I suppose, must
> means that "Eq (MyData a)", and if it's true than "Eq a" is true,
> because how "MyData a" can be Eq without to be "Eq a" (with
> *automatically deriving* of Eq instance) ?!
>
> By the way, for Monoid (which is "* -> Constraint") I can add "Eq a"
> constraint without problems:
>
>   instance Eq a => Monoid (Origin a) where
>     mempty = NoMyData
>     mappend NoMyData a = a
>     mappend a NoMyData = a
>     mappend (MyData a) (MyData b)|a == b = MyData a
>                                  |otherwise = NoMyData
>
> but not for Alternative, which is "(* -> *) -> Constraint".
>
> *ORIGINAL ERROR DUMP*:
> ======================
>     42  16 error           error:
>                                • No instance for (Eq a) arising from a use of ‘==’
>                                  Possible fix:
>                                    add (Eq a) to the context of
>                                      the type signature for:
>                                        (<|>) :: Origin a -> Origin a -> Origin a
>                                • In the expression: a == b
>                                  In the expression: if a == b then NoOrigin else NoOrigin
>                                  In an equation for ‘<|>’:
>                                      a <|> b = if a == b then NoOrigin
>                                      else NoOrigin (intero)
>
>
> /Best regards
>   Paul
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


More information about the Beginners mailing list