Yesod's shakespearean templates (hamlet) and I

2019-02-25 05:23发布

问题:

In Hamlet, how does one uses the result of an IO operation inside #{...} ?

For instance :

someIO :: IO String
-----------------

$with stuff <- someIO
    <p>#{stuff}

Fails with

No instance for (blaze-markup-0.6.0.0:Text.Blaze.ToMarkup
                       (IO String))
      arising from a use of `toHtml'

I fear that I have not approached the problem from the right angle, could someone shed some light on this issue for me?

Thank you

回答1:

Hamlet is just providing an alternate syntax for normal Haskell code, so like normal Haskell, you have to keep your impure actions separate. In other words, you need to run the IO action outside of the template.