Я столкнулся с интересной проблемой, которая, по моему мнению, может быть подходящим местом для Template Haskell. Я работаю над веб-интерфейсом базы данных, используя yesod и yesod-persistant. Я генерирую свои типы баз данных, используя функцию mkPerist
и квазициклер persistLowerCase
. Моя проблема в том, что мне нужен способ редактировать поля базы данных, но запись кода группы для шести разных страниц для каждого из столбцов кажется невероятно повторяющейся. Я решил, что могу использовать Template Haskell для автоматического создания текстовых полей и флажков для редактирования этого столбца базы данных с учетом типа. В идеале я просто передал бы имя типа функции Template Haskell, а затем TH позаботился бы о создании всего Гамлета для этой страницы. Мой вопрос: могу ли я использовать шаблон Haskell в этом случае? Это лучшее решение? В частности, может ли шаблон Haskell генерировать код для других квазициклов? В частности, Гамлет? Вот ссылка на мой проект на данный момент: https://github.com/ProspectRidgeTech/PRADatabase Спасибо заранее! (PS. Дайте мне знать, если есть лучший способ подойти к этой проблеме, и если у вас есть какие-либо предложения по моему вопросу.)Могу ли я использовать шаблон Haskell для генерации кода Гамлета?
ответ
Чтобы ответить на ваш вопрос: Да, вы можете, однако я бы не рекомендовал его. Квази Цитатник это просто функция, которая взять строку и сгенерировать код, так что вы, когда вы видите
[hamlet|blah blah|]
Вы можете заменить его (или эквивалент)
$(hamlet "blah blah")
Так что ничто не мешает вам в TH для генерации строки в дереве вызовов. Однако одна из точек TH - безопасность типа. Создание строки для последующего разбора вида поражения объекта. Кроме того, эта генерация кода из 2 шагов, вероятно, будет трудно отлаживать.
В любом случае, если ваша проблема заключается в генерации таблицы для постоянных объектов, я не думаю, что вам нужно TH вообще и просто используйте информацию о постоянных полях. У меня была аналогичная проблема, и я написал код, который генерирует таблицу Html для списка объектов. Это не должно быть сложно изменить.
entitiesToTable :: PersistEntity a => (FieldDef -> Text) -> [Entity a] -> Html
entitiesToTable getColumn entities = do
let eDef = entityDef (map entityVal entities)
[shamlet|
<table.table.table-bordered.table-striped class="#{unHaskellName $ entityHaskell eDef}">
<tr>
<th> Id
$forall field <- entityFields eDef
<th> #{getColumn field}
$forall Entity eit entity <- entities
<tr>
<td.id> #{renderPersistValue $ toPersistValue eit}
$forall (pfield, fieldDef) <- zip (toPersistFields entity) (entityFields eDef)
<td class="#{getHaskellName fieldDef}" > #{renderPersistValue $ toPersistValue pfield}
|]
Написание кода для обработки формы и обновления базы данных может быть более сложным и нужно TH, однако не Гамлет участвует в этом шаге.
- 1. Шаблон генерации кода для C#
- 2. Как я могу использовать bytebuddy для генерации кода pojo
- 3. Могу я использовать фрагменты Visual Studio для генерации кода SQL
- 4. Могу ли я использовать общий веб-сервер для генерации HTML?
- 5. Как я могу использовать JPA при генерации кода?
- 6. Использовать бритву для генерации кода?
- 7. Могу ли я заставить Kronos-Haskell использовать мою платформу Haskell?
- 8. Могу ли я использовать ANTLR для двухстороннего разбора/генерации?
- 9. Могу ли я использовать тег для генерации pdf через evopdf?
- 10. Могу ли я использовать DoxyGen для документирования кода ActionScript?
- 11. Код генерации: Haskell?
- 12. Могу ли я использовать шаблон дизайна для решения этой проблемы?
- 13. Можно ли использовать шаблон C++ для управления генерацией кода?
- 14. Есть ли способ использовать Djinn для автоматического генерации кода Haskell в Emacs?
- 15. Могу ли я использовать шаблон IoC для достижения цели
- 16. Могу ли я использовать шаблон наблюдателя для обработки ошибок?
- 17. Могу ли я использовать угловой шаблон для моделирования?
- 18. Могу ли я использовать шаблон декоратора для обертывания тела метода?
- 19. Какой шаблон я могу использовать?
- 20. Является ли Atom подходящим для генерации C-кода общего назначения?
- 21. Могу ли я использовать охранников в охранниках в Haskell
- 22. Можно ли использовать шаблон haskell для получения имени текущего файла?
- 23. Возможности для генерации типов Haskell в Haskell («Haskell второго порядка»)?
- 24. Могу ли я создать шаблон для этого?
- 25. Улучшение кода для генерации дистрибутива
- 26. Могу ли я использовать ANTLR для непереработанного кода?
- 27. Могу ли я использовать отражение для проверки кода в методе?
- 28. Могу ли я использовать SSL-сертификат для подписывания кода clickonce?
- 29. Могу ли я использовать отражение PHP для извлечения кода функции?
- 30. Могу ли я использовать цикл для оптимизации моего кода?
Спасибо! Я думаю, что если я смогу решить хотя бы часть этой проблемы без TH, это, безусловно, способ ее решения! Я не знал, что Persistent предоставил такую информацию типа! В качестве быстрого последующего вопроса, откуда берется параметр 'getColumn'? Я предполагаю, что могу сделать что-то вроде '(runDB $ selectList [] [])', чтобы получить список всех «сущностей» из определенного столбца, но что делает '(FieldDef -> Text)'? Кроме того, вы могли бы связать меня с модулем, где определены эти постоянные функции? Спасибо за вашу помощь! – thelostlambda
'getColumn :: FieldDef -> Text' - это просто функция, которая извлекает имя из определения столбца, чтобы использовать его для имени столбца. Я лично использую 'unDBName. fieldDB', но вы можете изменить, например, изменить случай. – mb14
[там] (https://hackage.haskell.org/package/persistent-2.6/docs/Database-Persist-Types.html) – mb14