2008/12/26 Oscar Picasso <oscarpica...@gmail.com> > Hi, > > I can write: > *Main> let yes = not . not > *Main> :t yes > yes :: Bool -> Bool > > But not: > *Main> let isNotEqual = not . (==)
The definition of (.): f . g = \x -> f (g x) So: not . (==) = \x -> not ((==) x) But (==) x is a function (of type a -> Bool, which returns whether its argument is equal to x), not a Bool as not is expecting. Composition like that usually only works for single argument functions. It gets uglier quickly for multi arg functions: isNotEqual = (not .) . (==) You can define your own operator to help: (.:) = (.) . (.) Which is a bit of silly definition. I typically don't like pointfree style for any but the most transparent of uses, so in real life (tm), I'd probably write: (f .: g) x y = f (g x y) But be prepared for others to disagree with me. Luke > > <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? > > Oscar > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe