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

Yassine yassine912 at gmail.com
Thu Aug 3 19:19:49 UTC 2017


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.


More information about the Beginners mailing list