-- a function does not have to be defined in terms of specific data types. The defintion acts to -- constrain how a function can act, and allow Haskell to reason about your program. As such, it may -- not matter exactly what the data type is, as long as it obeys some constraints. -- Lists provide a good example function1 :: [a]->([a],[a]) function1 (x:xs) = ([x],xs) -- this takes a list of things, and returns a tuple of 2 lists OF THE SAME THINGS. -- the one definition you cannot use is a->b -- this would imply a something to something else, which while probably quite accurate is also to -- unconstrained as to be pointless. -- for generality most functions are actually defined in terms of type variables rather than -- specific data types.