[Haskell-cafe] Function composition
Roman Cheplyaka
roma at ro-che.info
Sat Dec 27 04:40:43 EST 2008
* Roman Cheplyaka <roma at ro-che.info> [2008-12-27 11:33:22+0200]
> * Oscar Picasso <oscarpicasso at 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
... and
isNotEqual = curry $ not . uncurry (==)
is curried version, which has type
isNotEqual :: (Eq b) => b -> b -> Bool
--
Roman I. Cheplyaka :: http://ro-che.info/
"Don't let school get in the way of your education." - Mark Twain
More information about the Haskell-Cafe
mailing list