[Haskell-beginners] Alternative instance w/ additional restriction

aquagnu aquagnu at gmail.com
Wed Jun 7 19:03:34 UTC 2017


Thank you, David!

> I honestly don't think so.  But you can ask on haskell-cafe or on
> stackoverflow if you like.  There is a reasonable chance that a class
> or library exists that already will do what you are looking for, just
> that I haven't heard of it.
> 
> On Wed, Jun 7, 2017 at 12:06 PM, Baa <aquagnu at gmail.com> wrote:
> > So, if I understood right, I'm trying to restrict instance more than
> > class allows. And only way to accomplish it - is to create own class
> > instead of Alternative which will not be based on
> > Functor :: (* -> *) -> *, like Alternative. No other workarounds?
> >
> >
> >
> > В Wed, 7 Jun 2017 11:25:26 -0400
> > David McBride <toad3k at gmail.com> пишет:
> >  
> >> 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  
> >> _______________________________________________
> >> Beginners mailing list
> >> Beginners at haskell.org
> >> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners  
> >
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners  
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



-- 
Best regards,
  Paul a.k.a. 6apcyk


More information about the Beginners mailing list