Hi Daniel,<br><br>When would I use either?&nbsp; What are the trade-offs?<br><br>Thanks<br><br>-John<br><br><div class="gmail_quote">On Mon, Jan 19, 2009 at 1:13 PM, Daniel Fischer <span dir="ltr">&lt;<a href="mailto:daniel.is.fischer@web.de">daniel.is.fischer@web.de</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Am Montag, 19. Januar 2009 02:44 schrieb John Ky:<br>
<div><div></div><div class="Wj3C7c">&gt; Hi,<br>
&gt;<br>
&gt; Possibly a silly question but is it possible to have a function that has a<br>
&gt; different return type based on it&#39;s first argument?<br>
&gt;<br>
&gt; For instance<br>
&gt;<br>
&gt; data Person = Person { name :: String, ... }<br>
&gt; data Business = Business { business_number :: Int, ...}<br>
&gt;<br>
&gt; key person = name person<br>
&gt; key business = business_number business<br>
&gt;<br>
&gt; Thanks<br>
&gt;<br>
&gt; -John<br>
<br>
</div></div>Well, you could use<br>
<br>
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,<br>
TypeSynonymInstances #-}<br>
module Key where<br>
<div class="Ih2E3d"><br>
data Person = Person { name :: String }<br>
data Business = Business { business_number :: Int}<br>
<br>
</div>class Key a b | a -&gt; b where<br>
 &nbsp; &nbsp;key :: a -&gt; b<br>
<br>
instance Key Person String where<br>
 &nbsp; &nbsp;key = name<br>
<br>
instance Key Business Int where<br>
 &nbsp; &nbsp;key = business_number<br>
<br>
or with type families:<br>
{-# LANGUAGE TypeFamilies #-}<br>
class Key2 a where<br>
 &nbsp; &nbsp;type Res a<br>
 &nbsp; &nbsp;key2 :: a -&gt; Res a<br>
<br>
instance Key2 Person where<br>
 &nbsp; &nbsp;type Res Person = String<br>
 &nbsp; &nbsp;key2 = name<br>
<br>
instance Key2 Business where<br>
 &nbsp; &nbsp;type Res Business = Int<br>
 &nbsp; &nbsp;key2 = business_number<br>
<br>
<br>
but apart from that and parametrically polymorphic functions (of type a -&gt; [a]<br>
or the like), I don&#39;t think it&#39;s possible, it would need dependent types.<br>
<br>
HTH,<br>
<font color="#888888">Daniel<br>
</font></blockquote></div><br>