Используя тип-безопасный URL-адреса через метод setmessage? (шамлет против Гамлета)


Как использовать типобезопасный url-адрес с setMessage?

Я хочу измениться

 ...
 setMessage [shamlet|<span .warning>Warning! See Help.|]
 ...

К сообщению, содержащему ссылку.

Из того, что я смог собрать до сих пор, это должно работать как-то так

 ...
 renderer <- getUrlRender
 let html = [hamlet|<span .warning>Warning! See #
                     <a href=@{HelpR}> Help!|]
 setMessage $ toHtml $ html renderer
 ...
Но этот код просто дает мне запутанные сообщения об ошибках по всему файлу. Я действительно читал печатную главу книги Йесод о шекспировских шаблонах, но обнаружил, что она не очень ясна в отношении вовлеченных типов. Например, какой тип производит [hamlet|...|]|? Без url-интерполяции ghci сообщает t -> Markup, но с URL-интерполяцией внутри, я просто получаю ошибки.

Меня далее смущают все синонимы типа, например, [shamlet|...|] доставляет что-то типа Html, в то время как setMessage ожидает Html (). Я не знаю, как их легко найти: Hoogle часто ничего не находит по теме, В то время как Google всегда находит, возможно, устаревшие версии (с примерами, которые больше не работают) - конечно, я в конечном итоге добираюсь до самой новой версии, но есть ли место, где я получаю легкий обзор над ними? (Может ли ghci перечислить все синонимы для типа?)

Обратите внимание, что на самом деле я хочу создать сообщение в чисто функциональном фрагменте кода, который позже будет использоваться обработчиком. Вот почему я хотел бы отделить отображение URL от того, где указан Гамлет. Спасибо за любой указатель в правильном направлении!
1 3

1 ответ:

Я думаю, что вы хотите использовать getUrlRenderParams . Как ни странно, сегодня на IRC всплыла соответствующая дискуссия. Шаблоны Hamlet принимают функцию отрисовки URL в качестве своего первого аргумента, и эта функция должна принимать два параметра: типобезопасный URL и список параметров строки запроса. getUrlRender возвращает функцию, которая не принимает параметры строки запроса, поэтому вместо этого вам нужен getUrlRenderParams.