Shouldn't it be laws that "show" must be injective and "read" must be surjective? Without such laws, one could define:data Foo = Fooinstance Show Foo where show _ _ = idinstance Read Foo where readPrec = pfailwhich should be prevented.