<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br><br>Отправлено с iPhone</div><div><br>17.11.2012, в 11:19, damodar kulkarni &lt;<a href="mailto:kdamodar2000@gmail.com">kdamodar2000@gmail.com</a>&gt; написал(а):<br><br></div><blockquote type="cite">In the second case, why the GHC doesn't give something like?<br><span style="font-family:courier new,monospace">(</span><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">[Char] </span>(</span><span style="font-family:courier new,monospace">a -&gt; t), Num a) =&gt; t</span><br></blockquote><div><br></div><div>Because "Num" is a class of types, while "String" is a type.</div><div><br></div><div>In other words, in the expression 3 "a" ghc doesn't know, what type 3 belongs to, it just knows that it should be of class Num. In particular, it could be of type "String -&gt; t" for some t, ghc wouldn't go over all possible types to see that there is no such instance of "Num".</div><div><br></div><div>On the other hand, in "a" 3 it knows exactly what type "a" is, strings are always of one type, "String" (which is an alias for [Char]). You can enable OverloadedStrings extension, which makes string literals polymorphic; then you'll have your type, which would be something like "(IsString (a -&gt; b), Num a) =&gt; b".</div><br><blockquote type="cite">Now let's consider the evaluation scenario:<br><br><div style="margin-left:40px">


<span style="font-family:courier new,monospace">Prelude&gt;&nbsp; 3 2<br><br>&lt;interactive&gt;:1:0:<br>&nbsp;&nbsp;&nbsp; No instance for (Num (t -&gt; t1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arising from the literal `3' at &lt;interactive&gt;:1:0-2<br>&nbsp;&nbsp;&nbsp; Possible fix: add an instance declaration for (Num (t -&gt; t1))<br>


&nbsp;&nbsp;&nbsp; In the expression: 3 2<br>&nbsp;&nbsp;&nbsp; In the definition of `it': it = 3 2<br></span></div><br>Note, how the GHC suggests us this "strange constraint" as a <b>possible fix</b> BUT see this:<br><div style="margin-left:40px">


<span style="font-family:courier new,monospace">Prelude&gt;&nbsp; "a" 2<br><br>&lt;interactive&gt;:1:0:<br>&nbsp;&nbsp;&nbsp; Couldn't match expected type `t1 -&gt; t'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; against inferred type `[Char]'<br>&nbsp;&nbsp;&nbsp; In the expression: "a" 2<br>


&nbsp;&nbsp;&nbsp; In the definition of `it': it = "a" 2<br></span><br></div>In this case the GHC doesn't even allow us to add any "possible fix".<br></blockquote><div><br></div><div>Same thing. "String" is NOT a functional type, and it would never be, while it's possible (and sometimes reasonable) to have a functional type of class "Num". Enable OverloadedStrings, and you'll see your desired "possible fix".</div></body></html>