
I tried to reproduce the definition of Eq with class Eq a where (==), (/=) :: a -> a -> Bool (/=) = not (==) (==) = not (/=) and got Couldn't match expected type `Bool' against inferred type `a1 -> a1 -> Bool' In the first argument of `not', namely `(==)' In the expression: not (==) In the definition of `/=': /= = not (==) Couldn't match expected type `Bool' against inferred type `a1 -> a1 -> Bool' In the first argument of `not', namely `(/=)' In the expression: not (/=) In the definition of `==': == = not (/=) What have I done wrong? Is it not possible to define Eq in point-free style?

On Mon, Aug 23, 2010 at 10:28:38AM +0300, John Smith wrote:
I tried to reproduce the definition of Eq with
class Eq a where (==), (/=) :: a -> a -> Bool
(/=) = not (==) (==) = not (/=)
Consider the type of not: not :: Bool -> Bool And the type of (==): (==) :: Eq a => a -> a -> Bool You are providing (==) as the argument to not, but this will not work, since not expects an argument of type Bool and (==) does not have type Bool (it has type a -> a -> Bool). This is what the error message is telling you. It is possible to define these in a point-free style, but I would not recommend it: (/=) = (not .) . (==) Is it obvious to you what this definition does, and how it works? Me neither. A little better would be something like oo f g x y = f (g x y) (/=) = not `oo` (==) But I still prefer the nice and simple x /= y = not (x == y) -Brent
participants (2)
-
Brent Yorgey
-
John Smith