
On Mon, 2007-12-24 at 11:15 +0200, Cristian Baboi wrote:
While reading the Haskell language report I noticed that function type is not an instance of class Read.
I was told that one cannot define them as an instance of class Show without breaking "referential transparency" or printing a constant.
f :: (a->b)->String f x = "bla bla bla"
How can I define a function to do the inverse operation ? g :: String -> ( a -> b )
This time I cannot see how referential transparency will deny it. What's the excuse now ?
Referential transparency has nothing to with this. The problem here is parametricity. However, if you give a non-parametric type (or add appropriate class constraints on a and b, or add (phantom) type information to the input), e.g. String -> (Int -> Int) then there is no trouble at all. The compiler (or something non-portably using extremely unsafe features) could provide a primitive String -> a that reads in a string and interprets it somehow as a value of type a. If the value represented by the string doesn't match the type that a is instantiated to, something bad is going to happen. Adding such a primitive would utterly destroy parametricity.