[Haskell-cafe] ask

Jeremy Shaw jeremy at n-heptane.com
Sun Sep 14 20:54:52 EDT 2008


Hello,

If we look at these two examples, it appears that the results are reversed:

Prelude> let n o = (-1 `o` 1) in n (-)
0
Prelude> let n o = (-1 `o` 1) in n (+)
-2
Prelude> 

we expect (-1 - 1) = -2 and (-1 + 1) = 0, but we get the opposite.

Due to operator precedence, the equations are being interpreted as:

Prelude> let n o = (-(1 `o` 1)) in n (-)
0
Prelude> let n o = (-(1 `o` 1)) in n (+)
-2

The fix is to use parens around a negative term:

Prelude> let n o = ((-1) `o` 1) in n (-)
-2
Prelude> let n o = ((-1) `o` 1) in n (+)
0
Prelude> 

I have heard complaints about the negation sign in Haskell before, I
suppose this is why. Hopefully someone else can provide more details.

j.

ps. You could probably also fix it by changing the precedence of the
`o` operator. I believe that is possible. But parens around (-b) is
the more standard solution.

At Mon, 15 Sep 2008 02:24:14 +0200,
Cetin Sert wrote:
> 
> Hi why do I get?
> 
> cetin at linux-d312:~/lab/exp/1> ./eq
> 23
> 23
> 3
> a = b = c = n1-0.8457820374040622n2-0.1542179625959377
> 
> when I run
> 
> import System.IO
> 
> main :: IO ()
> main = do
>   a ← ask "a"
>   b ← ask "b"
>   c ← ask "c"
>   eval a b c
> 
> ask v = do
>   putStr (v ++ " = ")
>   readLn
> 
> eval a b c = do
>   case delta < 0 of
>     True  → putStr "neg"
>     False → putStr ("n1" ++ show n1 ++ "n2" ++ show n2)
>   where
>     delta = b*b - 4*c*a
>     n  o  = (-b `o` sqrt(delta))/(2*a)
>     n1    = n (+)
>     n2    = n (-)


More information about the Haskell-Cafe mailing list