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, 2008-12-08 at 11:16 +1100, John Ky wrote:No. Of course not. But there's no guarantee that
> Hi Thomas,
>
> So "show . read" and "\x -> show (read x)" are actually mean different
> things?
show (read x) = x
either.
Of course it succeeds. You put the `show' first; show always succeeds
> Also, I never suspected that something like this should succeed:
>
> putStrLn $ (read . show) $ "!@#%$^DFD"
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