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