Haskell showFFloat的第三个参数

时间:2018-05-12 22:29:38

标签: function haskell

我正在研究抑制科学记数法的方法(每个程序员在某些时候都要处理的斗争)我发现了这个问题:

Haskell - how to avoid scientific notation in decimal output

现在,第一个答案使用了这样的东西:

showFullPrecision x = showFFloat Nothing x ""

这有效,但我无法弄清楚最后一个参数是什么,我不想盲目地使用代码。

showFFloat的文档说明其签名为showFFloat :: RealFloat a => Maybe Int -> a -> ShowS。接受Maybe Int并且很可能是浮点数,但是最后一个参数(在我们的例子中是空字符串)是什么?

1 个答案:

答案 0 :(得分:4)

ShowS与数字显示无关,这只是类似show的函数的正常结果。在道德上,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。但是,如果您只想查看这样显示的字符串,您需要做的是始终将其应用于""