<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Greetings. I post here from time to time as I work my way through Real World Haskell. I believe that I have understood most of what I have studied. However, today I ran into something that seems like magic.<div><br></div><div>I hope it's ok to refer to RWH here, as I believe that the book is very commonly used for learning the language. I'll include the code that is puzzling me here anyway, though.</div><div><br></div><div>On p.310 of RWH we have:</div><div><br></div><div><div>data Op = Plus | Minus | Mul | Div | Pow</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;deriving (Eq, Show)</div><div><br></div><div>data SymbolicManip a =&nbsp;</div><div>&nbsp;&nbsp; &nbsp;Number a</div><div>&nbsp;&nbsp;| Arith Op (SymbolicManip a) (SymbolicManip a)</div><div>&nbsp;&nbsp; &nbsp;deriving (Eq, Show)</div><div><br></div><div>instance Num a =&gt; Num (SymbolicManip a) where</div><div>&nbsp;&nbsp; &nbsp;a + b = Arith Plus a b</div><div>&nbsp;&nbsp; &nbsp;a - b = Arith Minus a b</div><div>&nbsp;&nbsp; &nbsp;a * b = Arith Mul a b</div><div>&nbsp;&nbsp; &nbsp;negate a = Arith Mul (Number (-1)) a</div><div>&nbsp;&nbsp; &nbsp;abs a = error "abs is unimplemented"</div><div>&nbsp;&nbsp; &nbsp;signum _ = error "signum is unimplemented"</div><div>&nbsp;&nbsp; &nbsp;fromInteger i = Number (fromInteger i)</div></div><div><br></div><div>Ok, so far so good. But the following example seems quite astounding to me:</div><div><br></div><div>ghci&gt; (5 * 10 + 2)::SymbolicManip Int</div><div>Arith Plus (Arith Mul (Number 5) (Number 10)) (Number 2)</div><div><br></div><div>The book says to notice that haskell "converted" 5 * 10 + 2 into a SymbolicManip. Indeed!</div><div><br></div><div>My understanding breaks down at this point. I suspect that it may be my weak grasp of the implications of lazy evaluation, and typeclasses generally.&nbsp;My (incorrect) intuition makes me think that the stuff inside the parentheses should be evaluated first, and <i>then</i>&nbsp;typed as a SymbolicManip. This would give the result Number 52.&nbsp;</div><div>&nbsp;</div><div>My question may be too vague to answer easily, but what I am hoping for is a bit of a narrative regarding how haskell knows that the pieces <i>inside</i>&nbsp;the parentheses are each of type SymbolicManip Int. Or something like that....</div><div><br></div><div>Thanks in advance.&nbsp;</div><div><br></div><div>- Jake -</div><div><br></div><div><br></div></body></html>