The type (<span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">String -&gt; Maybe (a, String)) should already be an instance of arbitrary if a is.</span><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><br>
One way of generating functions is to have some sort of hashing function (a -&gt; Int). Functions from a to b can be generating by using the hash value to transform the random seed before the b is generated. Here is a rough outline for such a system:<br>
<br>genB :: StdGen -&gt; B</span></font></div><div><span class="Apple-style-span" style="font-family: arial, sans-serif; border-collapse: collapse; ">hashA :: A -&gt; Int</span></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">transformGen :: Int -&gt; StdGen -&gt; StdGen<br>
<br>genFun :: StdGen -&gt; (A -&gt; B)</span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">genFun g a = genB $ transformGen (hashA a) g<br>
<br></span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">In QC you have this instance:</span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><br>
</span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="border-collapse: separate; font-family: monospace; font-size: 13px; line-height: 16px; white-space: nowrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">(<a href="http://hackage.haskell.org/packages/archive/QuickCheck/2.1.0.1/doc/html/Test-QuickCheck-Arbitrary.html#t:CoArbitrary" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(196, 69, 29); ">CoArbitrary</a> a, <a href="http://hackage.haskell.org/packages/archive/QuickCheck/2.1.0.1/doc/html/Test-QuickCheck-Arbitrary.html#t:Arbitrary" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(196, 69, 29); ">Arbitrary</a> b) =&gt; <a href="http://hackage.haskell.org/packages/archive/QuickCheck/2.1.0.1/doc/html/Test-QuickCheck-Arbitrary.html#t:Arbitrary" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(196, 69, 29); ">Arbitrary</a> (a -&gt; b)</span><br>
</span></font><br>And CoArbitrary is the class where you implement the trick described above. Look at the function called variant as well.<br><br></div><div>/J</div><div><br><div class="gmail_quote">On 16 September 2010 02:59, Ivan Lazar Miljenovic <span dir="ltr">&lt;<a href="mailto:ivan.miljenovic@gmail.com">ivan.miljenovic@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On 16 September 2010 01:58, Thomas Davie &lt;<a href="mailto:tom.davie@gmail.com">tom.davie@gmail.com</a>&gt; wrote:<br>

&gt;&gt; Firstly, as far as i can tell, one cannot declare a type synonym to be an instance of a type class, thus how would you make it an instance of Arbitrary?<br>
&gt;<br>
&gt; The standard solution here is to create a newtype, and generate them instead.<br>
<br>
</div>I&#39;ve also written and used dedicated generation functions (especially<br>
for Strings, since I don&#39;t want _really_ arbitrary strings since some<br>
of them might accidentally bring up formatting that my parser can&#39;t<br>
cope with (or will parse as something else).  Note that this is more<br>
for generating sub-parts of other data types, rather than for types I<br>
want to be able to run QC tests on.<br>
<font color="#888888"><br>
--<br>
Ivan Lazar Miljenovic<br>
<a href="mailto:Ivan.Miljenovic@gmail.com">Ivan.Miljenovic@gmail.com</a><br>
<a href="http://IvanMiljenovic.wordpress.com" target="_blank">IvanMiljenovic.wordpress.com</a><br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br></div>