So I have code that looks similar to this toy example in a Common Lisp project:<div><br></div><div><div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div>
(defgeneric to-list (data)</div></div><div><div>  (:documentation &quot;Convert given data type to a proper list&quot;))</div></div><div><div><br></div></div><div><div>(defmethod to-list ((data list))</div></div><div><div>

  list)</div></div><div><div><br></div></div><div><div>(defmethod to-list ((data vector))</div></div><div><div>  (coerce data &#39;list))</div></div><div><div><br></div></div><div><div>(defmethod to-list ((data binary-tree))</div>

</div><div><div>  (traverse #&#39;(lambda (x) x) data &#39;in-order))</div></div><div><br></div><div>;;; ... So on for other collection datatypes ...</div><div><br></div></blockquote><div><br></div><div>This way I can write a function to work on multiple collection types without having to define multiple methods to specialize on each.  In addition it allows me to define TO-LIST method for any future types I would to use those functions on. From what I understand this would be done similarly in Haskell with a type-class:</div>

<div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>class Listable a where</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>toList :: a -&gt; [b]</div><div><br></div></blockquote></blockquote>But I am not a Haskell expert, and my code doesn&#39;t literally have TO-LIST.<div><br>
</div><div>I see that Racket has generic functions, but they see to work a bit differently that CLOS-style generics.  Further, like Haskell&#39;s type-classes I would like to be able to provide a contract for functions that take a Listable type:</div>

<div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>(provide </div></blockquote><blockquote class="webkit-indent-blockquote" style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div>(contract-out </div></blockquote></blockquote><blockquote class="webkit-indent-blockquote" style="margin:0 0 0 40px;border:none;padding:0px"><blockquote class="webkit-indent-blockquote" style="margin:0 0 0 40px;border:none;padding:0px">
<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>&lt;...&gt; </div></blockquote></blockquote><blockquote class="webkit-indent-blockquote" style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div>[foo (-&gt; listable? bar?)] </div></blockquote></blockquote><blockquote class="webkit-indent-blockquote" style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div>&lt;...&gt;))</div></blockquote></blockquote></blockquote><div><br></div>
<div>I can do this in CL using a :BEFORE method</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>(defmethod foo :before ((collection t) &lt;...&gt;) </div>
</blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>(unless (find-method #&#39;to-list () (list (class-of collection)) nil) ; ensure collection object has TO-LIST method</div>
</blockquote></blockquote><blockquote class="webkit-indent-blockquote" style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div>; otherwise raise error condition)</div></blockquote></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div>&lt;...&gt;)</div><div><br></div></blockquote></blockquote>What would be the appropriate Racket construct or idiom to get sort of &quot;type-class&quot; or &quot;interface&quot; that can be enforced through contracts?<div>

<br></div><div>Thanks,</div><div>Helmut<br><div><br><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><br></div></blockquote></blockquote><br></div></div>