Thanks for the clarification. They're all the same, as you've explained:
Prelude> putStrLn $ (show . read) "123" *** Exception: Prelude.read: no parse Prelude> putStrLn $ show $ read "123" *** Exception: Prelude.read: no parse Prelude> putStrLn $ (\x -> show (read x)) "123" *** Exception: Prelude.read: no parse -John On Mon, Dec 8, 2008 at 12:08 PM, Jonathan Cast <[EMAIL PROTECTED]>wrote: > On Mon, 2008-12-08 at 11:16 +1100, John Ky wrote: > > Hi Thomas, > > > > So "show . read" and "\x -> show (read x)" are actually mean different > > things? > > No. Of course not. But there's no guarantee that > > show (read x) = x > > either. > > > Also, I never suspected that something like this should succeed: > > > > putStrLn $ (read . show) $ "[EMAIL PROTECTED]" > > Of course it succeeds. You put the `show' first; show always succeeds > and --- for the Show instances in the Prelude, plus some --- > > read (show x) = x > > for finite, total x. > > (Note that read . show /= show . read; they don't even have the same > type! > > show . read :: forall alpha. Show alpha => String -> String > read . show :: forall alpha beta. (Read alpha, Show beta) => alpha -> > beta > > NB: The reason why show . read is illegal should be screaming out at you > about now. The caveat --- other than the one I mentioned above --- to > claims that read . show = id should also be screaming out.) > > jcc >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe