My application is a server written in Haskell that receives uploads of structured data and persists them to disk and redistributes them on demand, kind of a persistent messaging middleware. Anyway, I started out using Haskell record syntax for everything, hit the usual problems with name clashes and ended up with field label names that looked like hungarian notation, everything looked a bit grimy and verbose etc,etc. As an experiment I got rid of the labels, and anywhere I had a product type that had more than one field of the same type (usually these were primitive types I hadn&#39;t bothered to create wrapper types for, e.g. Price and Quantity were both Double), I took that to be a &quot;code smell&quot; and created types that more accurately captured the use of the field&#39;s value in the program domain. <div>
<br></div><div>Next I created a class Extractor to provide a standard way to pull individual fields from the product type:</div><div><br></div><div>class Extract a b where extract :: a -&gt; b</div><div>e.g.:</div><div><div>
instance Extract Upload ClientID where extract (Upload c _ _ _ _ _) = c</div><div>instance Extract Upload RecordPeriod   where extract (Upload _ p _ _ _ _) = p</div></div><div><br></div><div>So I can pass an Upload to extract and thanks to type inference it will usually be unambiguous, and I can annotate with a type signature to make it clearer what field I&#39;m extracting as I see fit. </div>
<div>I was missing record update syntax so I added a class to make it easier to do that:</div><div><br></div><div>class Transform a b where transform :: a -&gt; (b-&gt;b) -&gt; a</div><div>e.g.:</div><div>instance Transform Upload ClientID where transform (Upload c p ab ar lr br) f = (Upload (f c) p ab ar lr br)</div>
<div>i.e. take a function that updates a contained value and apply it to the appropriate field in an otherwise identical copy of the original. </div><div><br></div><div>Apart from the verbosity of the instance declarations for every field I was pleased with the result, and the imposed discipline of giving each field a distinct type significantly improved the codebase. </div>
<div><br></div><div>My questions are:</div><div>1) I presume this approach has been explored and probably there is a well thought through library of helper classes and functions already out there, can someone please point me to it?</div>
<div>2) I don&#39;t know much about Haskell generics, but for product types in which all contained values are distinct types, it should be possible to automatically derive instances of Extract, since there&#39;s never ambiguity as to which field you want from a container if you&#39;ve specified the type of value you want, is this possible, and if so does it already exist?</div>
<div>3) In type theory, are product types consisting of distinct member types considered special in any way? i.e. does the concept have a name and what special properties do they have?</div><div><br></div><div> Thanks for your help. </div>
<div>T</div><div><br></div><div><br></div><div><br></div><div><br></div>