В примере с заменой printf на конкатенацию имеется в виду, что конкатенация лучше (быстрее, понятнее), чем printf? Сам модуль Text.Printf, кстати, очень любопытен, на первый взгляд там используется какая-то магия.
Рад, что Вам интересно.
Насчёт printf, если уметь пользоваться TH, то написать такой шаблон, преобразующийся в конкатенацию довольно просто. А в Text.Printf используется особая магия с классами типов, чтобы обеспечить переменное число аргументов — сам я не спец в этом, но разберусь на досуге, тоже интересная тема.
Лично я TH не пользовался, хватает остальных мощностей.
Придерживаюсь мнения, «в языке приходится использовать макросы, если остальное слабовато».
А так например deriveSomeClass может быть полезен. Сгенерировать instance класса бывает достаточно тривиально, но нереально обычными функциями, но ручками это делать каждый раз тоже не комильфо.
В www.yesodweb.com/ широко используется Template Haskell в купе с квази-цитированием — для шаблонов html/js/css, для роутинга запросов, для описания сущностей в БД.
Собственно, пример с deriveShow вначале довольно нагляден в этом плане. Имеется только определение алгебраического типа и по нему автоматически генерируется instance. Функциями высшего порядка это не сделать — они могут оперировать другими функциями, поскольку функции — это значения (объекты первого класса, если угодно), а код не является объектом первого класса, поэтому для его представления значением и дальнейшего преобразования (генерации) нужны специальные структуры данных, описывающие AST. Простите, если запутанно написал…
В общем, к аргументу (см. последнее предложение) VoidEx +1 ")
Введение в Template Haskell. Часть 1. Необходимый минимум