A couple of people have suggested this idea - pure by default, as opposed to impure by default.   In Frege, as you point out, anything written in Haskell is pure by default.  However, if you want to call methods from libraries or the JVM which are written in Java, then you have to tell Frege their level of purity.  So effectively, your Haskell code is the &quot;island of purity&quot; inside the wider sea of impure Java runtime.<p>But yes, I think this is a workable idea - so long as there was some way of identifying 3rd-party code purity instead of the annotation.