* Oscar Picasso <oscarpica...@gmail.com> [2008-12-26 22:37:26-0500]
> 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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to