
On Mar 31, 2006, at 11:43 PM, Henning Thielemann wrote:
A function is a set of assignments from arguments to function values. That is, a natural way to show a function would be to print all assigments. Say
Prelude> toLower [('A','a'), ('a','a'), ('1', '1'), ...
In principle this instance of 'show' could be even implemented, if there would be a function that provides all values of a type.
You can use type classes to implement this for *finite* functions, i.e., total functions over types which are Enum and Bounded (and Show-able), using for example a tabular format for the show: > putStr (show (uncurry (&&))) (False,False) False (False,True) False (True,False) False (True,True) True It's especially easy to justify showing functions in this context, since one is providing the entire extension of the function (and in a nice canonical order, given the Enum class of the domain type). You can also extend the Enum and Bounded classes to functions over Enum and Bounded types, allowing fun stuff like this: > fromEnum (&&) 4 > (toEnum 4 :: Bool->Bool->Bool) True False False (Unfortunately, although the tabular show style thus extends to higher-order functions, it doesn't work well.) Of course, this is all a bit of a hack, since the straightforward implementation really only accounts for total functions ... . -- Fritz