<div dir="ltr">On Wed, Jun 22, 2011 at 19:03, Costello, Roger L. <span dir="ltr"><<a href="mailto:costello@mitre.org">costello@mitre.org</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
myAND :: MyBool -> MyBool -> MyBool<br>
myAND F x = F<br>
myAND T x = x<br>
<br>
If the first argument is F then return F. I assumed that the second argument would not even bother being evaluated.<br>
<br>
I figured that I could provide an undefined value for the second argument:<br>
<br>
myAND F (1 / 0)<br>
<br>
However, that doesn't work. I get this error message:<br></blockquote><div><br>There's no evaluation here. Haskell does no implicit coercions for you (with a limited exception involving the definition of numeric literals) so you are passing a Fractional a => a (1/0) when a MyBool is expected, and MyBool isn't a Fractional. (No coercions means, in this case, that a number *cannot* be used as a boolean, neither a real one nor your alternative formulation, without some kind of explicit coercion.)<br>
<br>How you fix this depends on what you're trying to accomplish. If you really want to use a division by zero there, you need to use an Integral a => a and coerce it manually:<br><br>> myAND F (toEnum (1 `div` 0))<br>
<br>or, if you insist on Fractional,<br><br>> myAND F (toEnum (fromRational (1 / 0)))<br><br>...and both of these require that you declare MyBool as<br><br>> data MyBool = F | T deriving Enum<br><br>so that you can use toEnum.<br>
<br>If you're just trying to prove the point about lazy evaluation, leave the numbers out of it:<br><br>> myAND F undefined<br><br>("undefined"'s type is "a", that is, any type; from this you can infer that it can never produce an actual value, it can only raise an exception, because there is no value that inhabits all possible types.)<br>
</div></div><br>Alternately you can say<br><br>> myAND F (error "wait, what?")<br><br>which lets you control what message is printed if for some reason the second parameter is evaluated.<br><br>-- <br>brandon s allbery <a href="mailto:allbery.b@gmail.com" target="_blank">allbery.b@gmail.com</a><br>
wandering unix systems administrator (available) (412) 475-9364 vm/sms<br><br>
</div>