<div dir="ltr"><div>Hello,<br><br></div><div>So we need rank-2 type in <a id="gmail-v:runST" class="gmail-def">runST</a> :: (<span class="gmail-keyword">forall</span> s. <a href="https://hackage.haskell.org/package/base-4.11.0.0/docs/Control-Monad-ST.html#t:ST" title="Control.Monad.ST">ST</a> s a) -> a, to prevent s from appearing in a.<br></div><div><br>I have been thinking about this for a bit, but I failed to come up with a practical situation, where rank-3 types are necessary for safety of some abstraction.<br><br>The rank-3 example in here and any other I found, look very synthetic, i.e. limiting computation to id:<br><a href="https://ocharles.org.uk/blog/guest-posts/2014-12-18-rank-n-types.html">https://ocharles.org.uk/blog/guest-posts/2014-12-18-rank-n-types.html</a><br></div><div>and compared to the runST example of limiting a scope of a type variable for purposes of safety looks unnatural.<br></div><div>Could anyone please point me to a practical example of rank-3 polymorphism, where it is necessary for safety of an abstraction, if it exists?<br><br></div><div>I suspect there is a situation, where rank-3 is necessary for maintaining abstration exists, but I can't think of any.<br></div><div>Any ideas about such situations and even better situations where this is used on hackage?<br></div><div><br></div><div>Timotej Tomandl<br></div></div>