Less than you might think, in practice.  I see unsafePerformIO used three places.<p>First, debugging.  While there are sometimes better approaches, this is unobjectionable.<p>Second, I&#x27;ll sometimes use it in throw-away scripts.  Here I am knowingly losing some guarantees, but in a sufficiently constrained portion of the system that it&#x27;s rarely a problem.<p>Third, where it&#x27;s known to be safe and necessary.  This one is the most worrisome, but the community is pretty at expecting uses to 1) be <i>very</i> rare, and 2) have both safety and necessity justified.<p>Really, the fact that all values are inhabited by bottom is a bigger issue.  Still, IME, Haskell provides guarantees that are sufficiently reliable to be tremendously useful.