
On Mon, Feb 06, 2017 at 07:40:12PM +0000, mike h wrote:
I have a State by another name, Stat, just to experiment and learn. [...] I really can’t get what the <*> in the Applicative should be! I just do see how I ‘get the f out of the Stat’ and then apply it.
I’d be really grateful if someone would explain what it should be and the steps/reasoning needed to get there.
Hello Mike, when writing an instance, you always have to keep in mind: (a) the signature of the function you are writing and (b) what the instance is designed to do. In our case, (<*>) is: (<*>) :: Applicative f => f (a -> b) -> f a -> f b -- which we could 'rewrite' as (<*>) :: Stat s (a -> b) -> Stat s a -> Stat s b so we grab the results, one being a function and the other a value, and apply the first to the second. (b) is "pass the state around in the background". Good, let's put this in action: (Stat f) <*> (Stat g) = Stat $ \s -> let (h, s') = f s -- h is a function :: a -> b (a, s'') = g s' -- state passing b = h a in -- the application (b, s'') -- we're not returning just the tuple, we're returning -- even the bit before the 'let' statement And that is that. Was this clear?