> complement :: (a -> Bool) -> a -> Bool > complement p x = not (p x)
> By the signature, the first argument is a function > (predicate) which when given a value returns a Bool? > And the second argument is just a value? And the > function returns a Bool? Indeed. In the type expression, the lower-case identifiers are type variables, while the upper-case identifiers are types. Thus, "a" could be instantiated to any type, with the constraint that both appearances of "a" are the same type. > map (complement odd) [1,2,3,4,5,6] Typically, you would use function composition here: map (not.odd) [1..6] If you really want a seperate complement function, you could define it using a section: complement = (not.) > By similar reasoning the always function would seem to > have a signature > > a -> (b -> a) > > where the first argument is just a value and the > return value is a function that when given a possibly > different value just returns the value originally > given to always? > > Is that reasoning OK? Are > > a -> (b -> a) and a -> b -> a the same signature? Yes. Function application (->) is right-associative in a type expression. What about a value expression? f a b === (f a) b Looks like an inconsistency? Not if you think about it. :-) Of course, this is what curried functions and partial application are all about. > So the inferred type is usually pretty accurate? These > signatures are a bit confusing. Is there a good > tutorial? http://haskell.org/tutorial, particularly chapter 2. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe