<div dir="ltr"><div class="gmail_default" style="font-size:small">Suppose you have a class ListLike (which you do have, actually) and it has methods for operations on types that are like lists, and in particular it has a method fromListLike which converts any ListLike value to any other:</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    fromListLike :: ListLike full' item => full' -> full</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">the default implementation of this is simply</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    fromListLike = fromList . toList</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">but this means that if you happen to apply fromListLike to a value which is already the desired type, two unnecessary and possibly expensive conversions take place.  My question is, how can one write code that implements fromListLike in such a way that when the two type parameters are the same type it just uses</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    fromListLike = id</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">I've thought about using a class Convert a b class and writing an instance for every pair of ListLike instances.  I haven't convinced myself this would work, and if it does it means that adding a new instance involves writing a bunch of Convert instances.  Maybe one could somehow have a default implementation (fromList . toList) but then you run into overlapping instances.  Anyone have better ideas about any of this?  Hopefully I'm missing something dead simple...</div></div>