有人可以向我解释为什么字符串上的 show 函数不是 id 函数吗?例如
show (show 42)
将返回"\"42\""
奇怪的东西,对我来说不是本质的。
答案 0 :(得分:8)
show
如果只是将某些内容转换为任意字符串(如Java中的toString
),则不是很有用。如果结果 易于阅读和机器可读,则更有用,因此show
的常见用法是生成值为{{1}的序列化表示因此,您可以使用show
再次读取它,并且对于read
的大多数实现也是如此,以便您可以在Haskell中键入show
n的字符串REPL与show
类似,并返回反序列化的值。
因此,如果您有ghci
和"42"
之类的字符串,则需要获取字符串show
,因为当您在{{1}中键入"\"42\""
时(和等效使用42
函数),您得到一个数字,而当您在ghci
中键入read
时,您将获得所需的字符串。
答案 1 :(得分:6)
因为read
是show
的倒数。所以我应该始终read
show
的结果,并获得一个字符串。
> (read "42")::String
"*** Exception: Prelude.read: no parse
> (read "\"42\"")::String
"42"