<pre style="white-space:pre-wrap;background-color:rgb(255,255,255)"><div dir="auto"><br></div><div dir="auto">On Tue, Jul 24, 2018 at 5:52 AM,Ryan Reich wrote: <br></div><div dir="auto">> This seems like the canonical illustration of the dangers of UndecidableInstances.</div><div dir="auto"><br></div><div dir="auto">No I don't buy that explanation. The worst UndecidableInstances can do is send the type checker into a loop.</div><div dir="auto"><br></div><div dir="auto">For mutually recursive functions to cause looping, you don't need classes at all:</div><div dir="auto"><br></div><div dir="auto">foo :: Bool -> ()</div><div dir="auto">foo x = bar x</div><div dir="auto">bar :: () -> Bool</div><div dir="auto">bar x = foo x</div><div dir="auto"><br></div><div dir="auto">No typechecking will detect that loop. This `HasBool` example is just an obfuscated way to write that loop(?)</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">There's some odd thigs in the OP:</div><div dir="auto"><br></div><div dir="auto">Why use OVERLAPPABLE? Neither of those instances need it.</div><div dir="auto"><br></div><div dir="auto">Or are there more instances in the imports? (There must at least be the definition for class `Has`.) If so, what are their constraints? And what are their implementations? Perhaps that's causing the looping?</div><div dir="auto"><br></div><div dir="auto">Will `runRIO` or `view` use one of those other instances?</div><div dir="auto"><br></div><div dir="auto">What does this mean: "I can compile an equivalent program; it loops on execution."?</div><div dir="auto"><br></div><div dir="auto">There doesn't need to be a `Bool` in the "environment": the `HasBool a` instance introduces `Bool` in its constraint.</div><div dir="auto"><br></div><div dir="auto">I suggest boiling this down to a stand-alone program not needing imports. Then tell the whole story.</div><div dir="auto"><br></div><div dir="auto">AntC</div><div dir="auto">

On Mon, Jul 23, 2018 at 2:10 PM, Theodore Lief Gannon < </div><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">tanuki at gmail.com</a>>
wrote:

><i> λ. :set -XFlexibleContexts -XFlexibleInstances -XMultiParamTypeClasses
</i>><i> -XUndecidableInstances
</i>><i> λ. import RIO
</i>><i> λ. import Data.Has
</i>><i> λ. class HasBool a where boolL :: Lens' a Bool
</i>><i> λ. instance {-#OVERLAPPABLE#-} HasBool a => Has Bool a where hasLens =
</i>><i> boolL
</i>><i> λ. instance {-#OVERLAPPABLE#-} Has Bool a => HasBool a where boolL =
</i>><i> hasLens
</i>><i> λ. runRIO () $ view boolL
</i>><i> ^CInterrupted.
</i>><i>
</i>><i> The RIO environment () doesn't contain a Bool. I can see how the
</i>><i> typechecker might get lost in this, but I can compile an equivalent
</i>><i> program; it loops on execution.
</i>><i>
</i>><i> _______________________________________________
</i>><i> Haskell-Cafe mailing list
</i>><i> To (un)subscribe, modify options or view archives go to:
</i>><i> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a>
</i>><i> Only members subscribed via the mailman list are allowed to post.
</i>><i>
</i>-------------- next part --------------
An HTML attachment was scrubbed...
URL: <<a href="http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180723/a47a91b9/attachment.html">http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180723/a47a91b9/attachment.html</a>></pre>