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. _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
