<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1253">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-GB" link="blue" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hello,</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Have a look at this:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">> mytriple (1 :: Integer) 'a' 'b'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><interactive>:418:28: error:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    • Couldn't match expected type ‘Integer’ with actual type ‘Char’<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    • In the third argument of ‘mytriple’, namely ‘'b'’<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      In the expression: mytriple (1 :: Integer) 'a' 'b'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      In an equation for ‘it’: it = mytriple (1 :: Integer) 'a' 'b'<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This is probably what you expected. In this case, you’ve explicitly stated that 1 is a value of type Integer.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">But look at the type here:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">> :t 3<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">3 :: Num p => p<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This might be a bit confusing. Haskell supports many different types of number (Int, Integer, Double, Complex, etc). Although they are different types, they are all instances of the same class (Num). When you type 1 (or some other numeric
 literal) into GHCi, it doesn’t (yet) know which of these types you want, but does know it has to be a type that’s an instance of Num, which is what the type signature gives. Hence you can do:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">> 3 `mod` 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">1<o:p></o:p></span></p>
<p class="MsoNormal">(which treats the 3 as some integral type), or</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">> 3 / 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">1.5<o:p></o:p></span></p>
<p class="MsoNormal">(which treats the 3 as a fractional – i.e. non-integral- type)</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Now it knows more about the type of 3 needed, it will ensure it is of a more specific type.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If typeclasses are new to you, you might want to read something like
<a href="http://learnyouahaskell.com/types-and-typeclasses#believe-the-type">this</a>.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Now look at:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">> :t (+)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">(+) :: Num a => a -> a -> a<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This says (+) can add two values of the same type, as long as that type is an instance of class Num. Hence:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">> 3 + 'a'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><interactive>:407:1: error:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    • No instance for (Num Char) arising from a use of ‘+’<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    • In the expression: 3 + 'a'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      In an equation for ‘it’: it = 3 + 'a'<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This now makes sense: ‘a’ is of type Char, and there is no instance declaration
<span style="font-family:"Courier New"">instance Num Char</span> (since Char’s are not numbers).</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Your example is much the same. In order for <span style="font-family:"Courier New"">
mytriple 1 'a' 'b'</span> to typecheck: ‘b’ must be a Char, and 1 must also be a Char, but 1 has to be a type that’s an instance of Num, so would require an
<span style="font-family:"Courier New"">instance Num Char</span> to exist.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hope that all makes sense,</p>
<p class="MsoNormal">David.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="border:none;padding:0cm"><b>From: </b><a href="mailto:conrad.dev@mail.com">Corrado Corrado</a><br>
<b>Sent: </b>05 February 2021 06:27<br>
<b>To: </b><a href="mailto:beginners@haskell.org">beginners@haskell.org</a><br>
<b>Subject: </b>[Haskell-beginners] type variables - error: 'No instance for'</p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Courier New"">Hello,<br>
I defined a simple function as below:</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Courier New"">mytriple :: a -> b -> a -> (a,b,a);<br>
mytriple x y z = (x,y,z);</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Courier New"">Then I checked 'mytriple' type variables signatures, so I declared a mytriple values in a 'wrong way':</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><br>
</span><span style="font-size:7.5pt;font-family:"Courier New"">                         ____ should be to the same type of the 1st argument<br>
                        /<br>
ë:t2 = mytriple 1 'a' 'b'</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Courier New""> error:<br>
    'No instance for (Num Char) arising from the literal '1'<br>
    'In the first argument of mytriple', namely '1'<br>
      In the expression: mytriple 1 'a' 'b'<br>
      In an equation for 't2': t2 = mytriple 1 'a' 'b'</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Courier New"">Ok, this is exactly what I aspected, but I do not understand the error.</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Courier New"">What means the sentence : 'No instance for (Num Char) arising from the literal '1'.'<br>
How is evaluated a function, in order to check that the params are type variables signatures?<br>
<br>
Why the error message refers to the 1st arguments?</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Courier New"">Thanks<br>
Conrad</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
</div>
</div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>