pure (+) <*> (Just 1) <*> (Just 2)
Is the expansion of above expression is correct?
pure (+) <*> (Just 1) <*> (Just 2)
= (Just (+)) <*> (Just 1) <*> (Just 2)
= (Just (1+)) <*> (Just 2)
= Just 3
if so then why we can't do just this (Just (+)) <*> (Just 2)
?
I believe you have already answered your question in the comments. So just for the sake of completion...
(Just (+)) <*> (Just 2)
is a partially applied function that the REPL cannot print, giving the error:
• No instance for (Show (Integer -> Integer)) arising from a use of ‘print’
,
but otherwise it is fine.
No problem here:
> :t (Just (+)) <*> (Just 2)
(Just (+)) <*> (Just 2) :: Num a => Maybe (a -> a)
.
Completing the function is fine too:
> f = (Just (+)) <*> (Just 2)
> f <*> Just 1
> Just 3
Your understanding seems perfectly sound.
Incidentally, another way of writing this is:
(+) <$> (Just 1) <*> (Just 2)