我正在寻找某种方法来抑制科学记数法(每个程序员在某些时候都必须处理的斗争),我发现了这个问题:
现在,第一个答案使用如下内容:
showFullPrecision x = showFFloat Nothing x ""
Run Code Online (Sandbox Code Playgroud)
这有效,但我无法弄清楚最后一个参数是什么,我不想盲目地使用代码。
的文档showFFloat说它的签名是showFFloat :: RealFloat a => Maybe Int -> a -> ShowS. 接受 aMaybe Int并且很可能是一个浮点数,但是最后一个参数(在我们的例子中是一个空字符串)是怎么回事?
ShowS具体与数字显示没有任何关系,这只是类显示功能的正常结果。从道德上讲,ShowS只是一个字符串。使用的原因
type ShowS = String -> String
Run Code Online (Sandbox Code Playgroud)
是String连接性能不佳,特别是,如果您执行类似的操作
s0, s1, s2, s3, s4 :: String
(((s0 ++ s1) ++ s2) ++ s3) ++ s4
Run Code Online (Sandbox Code Playgroud)
那么每个++算子都需要遍历它左边所有已经连接的字符串,给出二次时间复杂度——非常慢!
OTOH,与
(s0++), (s1++), (s2++), (s3++), (s4++) :: ShowS
((((s0++) . (s1++)) . (s2++)) . (s3++)) . (s4++)
Run Code Online (Sandbox Code Playgroud)
运行时只是将函数组合在一起,这是不变的成本。要实际评估串联,您最终会将此链应用于空字符串,如您的示例所示:
( ((((s0++) . (s1++)) . (s2++)) . (s3++)) . (s4++) ) ""
= s0++(s1++(s2++(s3++(s4++""))))
= s0++s1++s2++s3++s4
Run Code Online (Sandbox Code Playgroud)
因此,生成可能仍会与其他字符串组合的字符串的函数最好生成这样的差异列表字符串,而不是String直接生成。但是,如果您只想查看这样显示的字符串,您需要做的是始终将其应用于"".