[Haskell-beginners] Applicative: how <*> really works

sasa bogicevic brutallesale at gmail.com
Fri Aug 4 20:06:45 UTC 2017


Hey does this even compile for you ?

I get this in the Functor instance for Parser

     • Couldn't match expected type ‘String -> [(a, String)]’
                  with actual type ‘Parser a’
    • The function ‘p’ is applied to one argument,
      but its type ‘Parser a’ has none
      In the expression: p inp
      In the expression:
        case p inp of {
          [] -> []
          [(v, out)] -> [(g v, out)] }
    • Relevant bindings include
        p :: Parser a (bound at src/Mailinglistproblem.hs:19:10)
        g :: a -> b (bound at src/Mailinglistproblem.hs:19:8)
        fmap :: (a -> b) -> Parser a -> Parser b


{
	name: Bogicevic Sasa
	phone: +381606006200
}



> On Aug 4, 2017, at 22:02, Jeffrey Brown <jeffbrown.the at gmail.com> wrote:
> 
> If you post there, you could put the link on this thread; I'd be interested.
> 
> On Fri, Aug 4, 2017 at 3:04 PM, Yassine <yassine912 at gmail.com> wrote:
> Ok, thanks for your answer
> 
> 2017-08-04 20:04 GMT+02:00 David McBride <toad3k at gmail.com>:
> > This is a bit complicated for this list.  You might have a bit more
> > luck posting this to stackoverflow.com.
> >
> > On Thu, Aug 3, 2017 at 3:19 PM, Yassine <yassine912 at gmail.com> wrote:
> >> Hi,
> >>
> >> I have a question about functor applicate.
> >>
> >> I know that:
> >> pure (+1) <*> Just 2
> >>
> >>
> >> produce: Just 3
> >> because pure (+1) produce Just (+1) and then Just (+1) <*> Just 2
> >> produce Just (2+1)
> >>
> >>
> >> but in more complex case like:
> >> newtype Parser a = P (String -> [(a,String)])
> >>
> >> parse :: Parser a -> String -> [(a,String)]
> >> parse (P p) inp = p inp
> >>
> >>
> >> item :: Parser Char
> >> item = P (\inp -> case inp of
> >>  []     -> []
> >> (x:xs) -> [(x,xs)])
> >>
> >> instance Functor Parser where
> >> fmap g p = P (\inp -> case p inp of
> >> []              -> []
> >>  [(v, out)]      -> [(g v, out)])
> >>
> >> instance Applicative Parser where
> >> pure v = P (\inp -> [(v, inp)])
> >> pg <*> px = P (\inp -> case parse pg inp of
> >> []              -> []
> >> [(g, out)]      -> parse (fmap g px) out)
> >>
> >>
> >> When I do:
> >> parse (pure (\x y -> (x,y)) <*> item <*> item) "abc"
> >>
> >> The answer is:
> >> [(('a','b'),"c")]
> >>
> >> But I don't understand what exactly happens.
> >> First:
> >> pure (\x y -> (x,y)) => P (\inp -> [(\x y -> (x,y), inp)])
> >>
> >> Then:
> >> P (\inp -> [(\x y -> (x,y), inp)]) <*> item => ???
> >>
> >> Can someone explain what's happens step by step please.
> >>
> >> Thank you.
> >> _______________________________________________
> >> 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
> 
> 
> 
> -- 
> Jeff Brown | Jeffrey Benjamin Brown
> Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github   
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



More information about the Beginners mailing list