See also part 1. All of the code in this post is available in the blog repository on Github. Last time we saw a way to implement Union/Find, an algorithm which depends critically on observable mutable memory, within a particular abstract monad called Mem. Monads implementing Mem model mutable memory (say that 10 times fast) and we saw that’s sufficient to recover Union/Find. But we didn’t actually