[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