
* Oscar Picasso
Hi,
I can write: *Main> let yes = not . not *Main> :t yes yes :: Bool -> Bool
But not: *Main> let isNotEqual = not . (==)
<interactive>:1:23: Couldn't match expected type `Bool' against inferred type `a -> Bool' Probable cause: `==' is applied to too few arguments In the second argument of `(.)', namely `(==)' In the expression: not . (==)
Why?
You might want to read about currying[1]. This will explain why (==) does not take a pair of values, it rather takes one value and then another, and that's why it is not composable in the way you want. What you're trying to do is easier to do with uncurried functions: Prelude> let isNotEqual = not . uncurry (==) Prelude> :t isNotEqual isNotEqual :: (Eq a) => (a, a) -> Bool Prelude> isNotEqual (3,4) True Prelude> isNotEqual (3,3) False (note that -XNoMonomorphismRestriction is used here) 1. http://www.haskell.org/haskellwiki/Currying -- Roman I. Cheplyaka :: http://ro-che.info/ "Don't let school get in the way of your education." - Mark Twain