data Store s a = Store (s -> a) s
fmap g (Store f s) = Store (g.f) s
extract f s = f s
duplicate (Store f s) = Store (Store f) s
Store f1 s1 <@> Store f2 s2 = Store (\s -> f1 s (f2 s2)) s1
We will also use S as a synonym for the data constructor Store