Haskell третий аргумент showFFloat - PullRequest
0 голосов
/ 13 мая 2018

Я искал какой-то способ подавить научную нотацию (борьбу, с которой каждый программист должен иметь дело в какой-то момент), и я нашел этот вопрос:

Haskell - как избежать научного обозначения в десятичном выражении

Теперь, первый ответ использует что-то вроде этого:

showFullPrecision x = showFFloat Nothing x ""

Это работает, но я не могу понять, каков последний аргумент, и я не хочу просто слепо использовать код.

Документация для showFFloat гласит, что ее подпись showFFloat :: RealFloat a => Maybe Int -> a -> ShowS. Взять Maybe Int и, скорее всего, число с плавающей точкой, но что с последним аргументом (в нашем случае пустой строкой)?

1 Ответ

0 голосов
/ 13 мая 2018

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 напрямую. Но если вы просто хотите просмотреть такую ​​показанную строку, вам всегда нужно применить ее к "".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...