Как стать автором
Обновить

Комментарии 7

Большое спасибо, Template Haskell нужен.

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

Там много холивара по этому поводу идет (использовать ли TH или лучше обходиться чистым хаскелем). И автор написал развернутый пост по этому поводу: www.yesodweb.com/blog/2011/10/code-generation-conversation
Собственно, пример с deriveShow вначале довольно нагляден в этом плане. Имеется только определение алгебраического типа и по нему автоматически генерируется instance. Функциями высшего порядка это не сделать — они могут оперировать другими функциями, поскольку функции — это значения (объекты первого класса, если угодно), а код не является объектом первого класса, поэтому для его представления значением и дальнейшего преобразования (генерации) нужны специальные структуры данных, описывающие AST. Простите, если запутанно написал…
В общем, к аргументу (см. последнее предложение) VoidEx +1 ")
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории