
Conor McBride
Michael wrote
David wrote (with patch applied): [...] (Backward f) <*> (Backward a) = Backward (a <**> f) According to the haddock of Control.Applicative, this line is semantically equivalent to Backward f <*> Backward a = Backward (f <*> a) I'm not saying the haddock is entirely clear, but it certainly doesn't necessitate the interpretation you're making.
OK, right. But the text "A variant of <*> with the arguments reversed" at least sounds like "<**> = flip <*>", which obviously is untrue then.
Appearances can be deceptive, so why not actually try it? I tried it, but too pure. I just checked whether some arguments are somehow reversed, but didn't pay care to the effects:
*Main> runBackward $ (pure (++)) <*> (pure "Hello") <*> (pure " World") "Hello World" *Main> runBackward $ (pure (^)) <*> (pure 1) <*> (pure 2) 1
*Backward> runBackward $ traverse (Backward . print) ["bong", "bing"] "bing" "bong" [(),()] Thanks for the convincing example.
In contrast with monads, the applicative interface does not offer the ability to make the choice of one computation depend on the value of another Yeah, right. That's the point of Applicative, if I remember the paper correctly.
All the best Thanks for the explanation.
Michael Karcher