<div class="gmail_quote">2008/12/7 John Ky <span dir="ltr">&lt;<a href="mailto:newhoggy@gmail.com">newhoggy@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Thanks for the clarification.<br><br>They&#39;re all the same, as you&#39;ve explained:<br><br>Prelude&gt; putStrLn $ (show . read) &quot;123&quot;<br>*** Exception: Prelude.read: no parse</blockquote><div><br></div><div>
The &quot;no parse&quot; is an artifact of defaulting:</div><div><br></div><div>Prelude&gt; putstrLn $ (show . read) &quot;()&quot;</div><div>()</div><div><br></div><div>It&#39;s because ghci defaults the free type variables to (). &nbsp;</div>
<div>&nbsp;</div><div>The signatures for show and read are:</div><div><br></div><div>show :: (Show a) =&gt; a -&gt; String</div><div>read :: (Read a) =&gt; String -&gt; a</div><div><br></div><div>So when you do show . read, you get String -&gt; String, but where did the a&#39;s go? &nbsp;What type were they (what type is &quot;read&quot; trying to parse)? &nbsp;Ghci makes them (), because it&#39;s weird like that. &nbsp;A compiler will complain that there is an unconstrained type variable that it doesn&#39;t know what to do with.</div>
<div><br></div><div>You can constrain it yourself with something like:</div><div><br></div><div>showAs :: (Show a) =&gt; a -&gt; a -&gt; String</div><div>showAs typ x = show (x `asTypeOf` typ)</div><div><br></div><div>Then:</div>
<div><br></div><div>Prelude&gt; putStrLn $ (showAs (undefined::Int) . read) &quot;123&quot;</div><div>123</div><div><br></div><div>But this situation doesn&#39;t arise in practice, because usually you do something with a value you&#39;ve read other than just printing it, and that something will determine the type to read.</div>
<div><br></div><div>Luke</div></div>