2. This is the only way you can evaluate your "pure value", and because of the monadic chaining, you cannot do it twice, you cannot "re-evaluate" it.

I'm sure there is a sense in which this is true, but I'm not seeing it.  How would you describe what's going on here?

twice :: IO () -> IO ()
twice x = x >> x

main = twice $ putStrLn "foo"

I would call that evaluating x twice (incidentally creating two separate evaluations of one pure action description), but I'd like to better see your perspective here.



Regarding this issue generally, I feel like everyone's climbed on their particular war horses when someone sounded the PURITY trumpet, when *I don't think this is the kind of purity Applicative is talking about* - different things can be pure in different ways.