我正在寻找一种抑制科学计数法的方法(每个程序员在某个时候都必须解决的难题),我发现了这个问题:
现在,第一个答案使用如下内容:
showFullPrecision x = showFFloat Nothing x ""
这行得通,但我不知道最后一个参数是什么,我不想只盲目使用代码。
的文档showFFloat
说它的签名是showFFloat :: RealFloat a => Maybe Int -> a -> ShowS
。接受一个Maybe Int
且很可能是一个浮点数,但是最后一个参数(在我们的情况下为空字符串)是什么?
ShowS
与数字显示完全无关,这只是类似于显示功能的正常结果。道德上,ShowS
只是一个字符串。改用的原因
type ShowS = String -> String
是String
连接性能不好的地方,特别是如果您执行类似的操作
s0, s1, s2, s3, s4 :: String
(((s0 ++ s1) ++ s2) ++ s3) ++ s4
那么每个++
操作员都需要遍历其左侧所有已连接的字符串,从而带来二次时间复杂度–非常慢!
OTOH,用
(s0++), (s1++), (s2++), (s3++), (s4++) :: ShowS
((((s0++) . (s1++)) . (s2++)) . (s3++)) . (s4++)
运行时只是将功能组合在一起,这是不变的代价。要实际评估连接,您将最终将此链应用于空字符串,如您的示例:
( ((((s0++) . (s1++)) . (s2++)) . (s3++)) . (s4++) ) ""
= s0++(s1++(s2++(s3++(s4++""))))
= s0++s1++s2++s3++s4
因此,产生一个可能仍会与其他字符串组合的字符串的函数最好产生这样的差异列表字符串,而不是String
直接产生。但是,如果您只想查看这样显示的字符串,则始终需要将其应用于""
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句