Thanks Stepen <br><br>will try out factoring<br><br><div class="gmail_quote">On Mon, Mar 8, 2010 at 7:44 PM, Stephen Tetley <span dir="ltr">&lt;<a href="mailto:stephen.tetley@gmail.com">stephen.tetley@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Hi Joe - I&#39;ve cc&#39;ed back to list...<br>
<br>
I&#39;m supposing from what you&#39;ve said that only DataConst1 &amp; DataConst2<br>
have ids - so I&#39;ve made a type synonym VId<br>
<br>
<br>
type VId = Int<br>
<br>
data TestData = DataConst1 VId String<br>
              | DataConst2 VId Int<br>
<div class="im">              | DataConst3 Sting String<br>
              | DataConst4 String Int<br>
<br>
<br>
</div>If both DataConst1 &amp; DataConst2 have VId&#39;s the you right - you have to<br>
pattern match for both:<br>
<br>
setVid_to_4 :: TestData -&gt; TestData<br>
setVid_to_4 (DataConst1 _ y)     = DataConst1 4 y<br>
setVid_to_4 (DataConst2 _ y)     = DataConst2 4 y<br>
setVid_to_4 var                  = var<br>
<br>
<br>
If all the cases of TestData had a VId e.g.:<br>
<br>
<br>
data TestData = DataConst1 VId String<br>
              | DataConst2 VId Int<br>
              | DataConst3 VId Sting String<br>
              | DataConst4 Vid String Int<br>
<br>
... then you could factor out VId to get these two data types<br>
<br>
<br>
data FactoredTD = FactoredTD VId TD<br>
<br>
data TD = DC1 String<br>
         | DC2 Int<br>
         | DC3 String String<br>
         | DC4 String Int<br>
<br>
setVid_to_4 :: FactoredTD -&gt; FactoredTD<br>
setVid_to_4 (FactoredTD _ y)     = FactoredTD 4 y<br>
<br>
<br>
This factoring transformation is quite common.<br>
<br>
For your particular data type you could factor the other way:<br>
<br>
<br>
data TestDataX = DataConst1_or_2 VId (Either String Int)<br>
<div class="im">               | DataConst3 Sting String<br>
               | DataConst4 String Int<br>
<br>
<br>
</div>setVid_to_4 :: TestDataX -&gt; TestDataX<br>
setVid_to_4 (DataConst1_or_2 _ y) = DataConst1_or_2 4 y<br>
setVid_to_4 y                     = y<br>
<br>
However this factoring is quite horrible - I can&#39;t think of anywhere<br>
where I&#39;ve seen it.<br>
<br>
Generally I wouldn&#39;t be too concerned about redundancy in pattern<br>
matching. If its easy to consistently name all the constructors in an<br>
algebraic data type, then that&#39;s a strong indication that you&#39;ve put<br>
it into a good form.<br>
<br>
If you&#39;re still taxed by duplicate pattern matching you can then write<br>
projection and modification functions to do it once and once only:<br>
<br>
<br>
-- Has to return a Maybe as DC3 and DC4 have no ID<br>
getVId :: TestData -&gt; Maybe VId<br>
getVid (DataConst1 iden _) = Just iden<br>
getVid (DataConst2 iden _) = Just iden<br>
getVid _                   = Nothing<br>
<br>
<br>
-- note - uses an update function that accesses the original value<br>
-- rather than a simple replace<br>
--<br>
updateVid :: (Vid -&gt; Vid) -&gt; TestData -&gt; TestData<br>
updateVid f  (DataConst1 iden y) = DataConst1 (f iden) y<br>
updateVid f  (DataConst2 iden y) = DataConst2 (f iden) y<br>
updateVid f  var                 = var<br>
<br>
incrementVid :: TestData -&gt; TestData<br>
incrementVid = updateVid (\x -&gt; x+1)<br>
<br>
Best wishes<br>
<font color="#888888"><br>
Stephen<br>
</font><div><div></div><div class="h5"><br>
On 8 March 2010 12:19, Joe Fox &lt;<a href="mailto:fox.joe87@gmail.com">fox.joe87@gmail.com</a>&gt; wrote:<br>
&gt; Hi Guys,<br>
&gt;<br>
&gt; First thanks for all yours inputs.<br>
&gt;<br>
&gt; Actually test is just a simple function , actually my actual function is<br>
&gt; pretty complex and huge ...<br>
&gt;<br>
&gt; let me redefine Test function , i guess i took a bad example which created<br>
&gt; lot of confusion<br>
&gt;<br>
&gt; the type of the test functions will be  something like this  , (i don&#39;t have<br>
&gt; any ambiguity on type of the function, )<br>
&gt;<br>
&gt; test:: TestData -&gt; TestData<br>
&gt;<br>
&gt; My question is like is there any way i can match multiple pattern in a<br>
&gt; function statement .<br>
&gt;<br>
&gt; like this (I know this doesnt work , but just trying to explain whats on my<br>
&gt; mind)<br>
&gt;<br>
&gt;<br>
&gt; test var@(DataConst1 x y) == var@(DataConst2 x y) = var{id=4} -- let&#39;s say<br>
&gt; id is the record holder for first record<br>
&gt; test var@(_) = var --- any for other two its returns the same<br>
&gt;<br>
&gt; the working code would be like<br>
&gt; test var@(DataConst1 x y) = var{id=4}<br>
&gt; test var@(DataConst2 x y) = var{id=4} --- I want these two lines in one<br>
&gt; line, because the logic is same<br>
&gt; test var@(_) = var<br>
&gt;<br>
&gt; some thing of this sort.<br>
&gt; I hope i didnt add to the confusion<br>
&gt;<br>
&gt;<br>
&gt; Thanks<br>
&gt; Joe<br>
&gt;<br>
</div></div></blockquote></div><br>